目录
- Python介绍
- Python基础知识
- 输入输出
- 算数运算符
- 分支结构
- 循环结构
- 列表
- 元组
- 字典
- 函数
- 正则表达式
- 面向对象
Python介绍
- 解释型语言 : 解释型语言编写的程序不可以进行预编译,以文本方式存储代码,会将代码一句一句直接运行。在发布程序时,看起来省了道编译工序,但是在运行程序时候,必须先解释再运行。如python
- 编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成机械语言的文件,运行时不需要重新编译,直接使用编译结果就行了,程序执行效率高,依赖编译器,跨平台性差。如C,C++
Python基础知识
#单行注释
"""
多行注释
"""
#!/usr/bin/python
print("Hello, World!")
关于脚本第一行的 #!/usr/bin/python 的解释,相信很多不熟悉 Linux 系统的同学需要普及这个知识,脚本语言的第一行,只对 Linux/Unix 用户适用,用来指定本脚本用什么解释器来执行。
有这句的,加上执行权限后,可以直接用 ./ 执行,不然会出错,因为找不到 python 解释器。
#!/usr/bin/python 是告诉操作系统执行这个脚本的时候,调用 /usr/bin 下的 python 解释器。
#!/usr/bin/env python 这种用法是为了防止操作系统用户没有将 python 装在默认的 /usr/bin 路径里。当系统看到这一行的时候,首先会到 env 设置里查找 python 的安装路径,再调用对应路径下的解释器程序完成操作。
#!/usr/bin/python 相当于写死了 python 路径。
#!/usr/bin/env python 会去环境设置寻找 python 目录,可以增强代码的可移植性,推荐这种写法。
分成两种情况:
(1)如果调用 python 脚本时,使用:
python script.py
#!/usr/bin/python 被忽略,等同于注释
(2)如果调用python脚本时,使用:
./script.py
输入输出
print的基本用法
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
可以看到,print的参数为以下几项:
- value, …:要打印的值, 以逗号分隔。
- sep:分隔符,默认以空格分隔(打印的每项之间以空格分开)。
- end:结束符, 默认为换行符(print默认会换行)。
- file:打印的目的对象,默认为标准输出(可以改为其他的类似文件的对象)。
- flush:是否立即输出到file指定的流对象中。
(1) 数据类型
value可以是不同的数据类型,通过逗号将各数据项分开。
>>> print("Hello World!", "2018/11/18", 3.14)
Hello World! 2018/11/18 3.14
(2) 更改分隔符
从上一个例子可以看出,输出的各项以空格进行分隔。更改seq值可以更改分隔符类型,如下:
>>> print("Hello World!", "2018/11/18", 3.14, sep='#')
Hello World!#2018/11/18#3.14
(3) 更改结束符
下面这个例子:
>>> print("Hello World!")
... print("Hello World!")
Hello World!
Hello World!
可以看出,print默认以换行符结束。这里可以通过更改end值更改结束符,如下:
>>> print("Hello World!", end=' ')
... print("Hello World!", end=' ')
Hello World! Hello World!
(4) 更改输出位置
print默认输出到标准输出,我们可以通过file参数来更改输出,如下:
f=open("out.txt", "w")
print("Hello World!", file=f)
f.close()
这里更改输出为out.txt,打开out.txt文件可以看到里面的内容为Hello World!.
值得注意的是,print是不会立即输出到out.txt文件中的,它将要打印的数据保留再缓冲区,当执行到f.close()时才将数据写入文件中。如果需要立即打印到文件中,将flush参数改为true即可。
(6)使用占位符
print ("Name:%10s Age:%8d Height:%8.2f"%("Aviad",25,1.83))
input的基本用法
input(prompt=None, /)
可以看出,input从标准输入读取一个字符串,并去掉最后的换行符。此外,input的prompt参数可同于打印提示信息。注意这里读取的任何内容都会被转换为字符串。
>>> a=input("Input:")
Input:Hello World!
>>> type(a)
<class 'str'>
>>> b=input("Input:")
Input:123
>>> type(b)
<class 'str'>
如果需要读取整数,利用int进行强制转换即可:
>>> c=int(input("Input:"))
Input:123
>>> type(c)
<class 'int'>
算数运算符
分支结构
# 分支结构模板
if 条件 :
condition
elif 条件:
condition
else:
condition
循环结构
for循环
for 变量 in 序列:
语句
else:
语句
for i in range(0,10) :
print (i,end=" ")
else :
print("end")
#0 1 2 3 4 5 6 7 8 9 end
注意else语句只有在for循环正常退出时执行
for i in range(0,10) :
print (i,end=" ")
break
else :
print("end")
# 0
while循环
while 条件表达式:
语句块1
else:
语句块2
列表
序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。
序列都可以进行的操作包括索引,切片,加,乘,检查成员。
列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。
列表的数据项不需要具有相同的类型。
序号 | 函数 |
1 | cmp(list1, list2) 比较两个列表的元素 |
2 | len(list) 列表元素个数 |
3 | max(list) 返回列表元素最大值 |
4 | min(list) 返回列表元素最小值 |
5 | list(seq) 将元组转换为列表 |
序号 | 方法 |
1 | list.append(obj) 在列表末尾添加新的对象 |
2 | list.count(obj) 统计某个元素在列表中出现的次数 |
3 | list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表) |
4 | list.index(obj) 从列表中找出某个值第一个匹配项的索引位置 |
5 | list.insert(index, obj) 将对象插入列表的index位置 |
6 | list.pop([index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值 |
7 | list.remove(obj) 移除列表中某个值的第一个匹配项 |
8 | list.reverse() 反向列表中元素 |
9 | list.sort(cmp=None, key=None, reverse=False) 对原列表进行排序 |
访问列表中的值
list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5, 6, 7 ]
print ("list1[0]: ", list1[0])
print ("list2: ", list2[1:-1:2])
#list1[0]: physics
#list2: [2, 4, 6]
列表的插入
list_a = [0,1,2,3,4]
list_b = [5,6,7,8,9]
print("list_a=%s" % str(list_a))
list_a.append(2.3)
print("list_a=" + str(list_a))
#list_a=[0, 1, 2, 3, 4]
#list_a=[0, 1, 2, 3, 4, 2.3]
#-------------------------------------------------
list_a = [0,1,2,3,4]
list_a.insert(6,250)
print("list_a=" + str(list_a))
#list_a=[0, 1, 2, 3, 4, 250]
#------------------------------------------------
list_a = [0,1,2,3,4]
list_b = [5,6,7,8,9]
list_b.extend(list_a)
print("list_b=" + str(list_b))
#list_b=[5, 6, 7, 8, 9, 0, 1, 2, 3, 4]
列表的删除
list1 = ['physics', 'chemistry', 1997, 2000]
print (list1)
del list1[2]
print ("After deleting value at index 2 : ")
print (list1)
#['physics', 'chemistry', 1997, 2000]
#After deleting value at index 2 :
#['physics', 'chemistry', 2000]
#----------------------------------------------
list1 = ['physics', 'chemistry', 1997, 2000]
print (list1)
list1.pop(0)
print ("After deleting value at index 2 : ")
print (list1)
#['physics', 'chemistry', 1997, 2000]
#After deleting value at index 2 :
#['chemistry', 1997, 2000]
列表的排序
list_a = [2,1,-1,6,9]
list_b = sorted(list_a,reverse=False)
print("list_a = ",list_a)
print("list_b = ",list_b)
list_a.sort(reverse=True)
print("list_a = ",list_a)
#list_a = [2, 1, -1, 6, 9]
#list_b = [-1, 1, 2, 6, 9]
#list_a = [9, 6, 2, 1, -1]
元组
Python的元组与列表类似,不同之处在于元组的元素不能修改。
元组使用小括号,列表使用方括号。
元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。
因为元组不能修改所以没有插入删除操作
tup = (1, 2, 3, 4, 5 )
#元组中只包含一个元素时,需要在元素后面添加逗号
tup1 = (50,)
#声明一个空元组
tup2 = ()
tup3 = tuple()
字典
字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:
d = {key1 : value1, key2 : value2 }
键必须是唯一的,但值则不必。
值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行
dict_a = dict()
dict_b = dict()
删除字典元素
dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
del dict['Name'] # 删除键 'Name'
#dict.clear() # 清空字典
#del dict # 删除字典
dict.pop("Age")
print("dict=", dict)
# sorted(可迭代对象,key=函数名,reverse=False/True)
序号 | 函数及描述 |
1 | radiansdict.clear() 删除字典内所有元素 |
2 | radiansdict.copy() 返回一个字典的浅复制 |
3 | radiansdict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值 |
4 | radiansdict.get(key, default=None) 返回指定键的值,如果值不在字典中返回default值 |
5 | key in dict 如果键在字典dict里返回true,否则返回false |
6 | radiansdict.items() 以列表返回可遍历的(键, 值) 元组数组 |
7 | radiansdict.keys() 返回一个迭代器,可以使用 list() 来转换为列表 |
8 | radiansdict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default |
9 | radiansdict.update(dict2) 把字典dict2的键/值对更新到dict里 |
10 | radiansdict.values() 返回一个迭代器,可以使用 list() 来转换为列表 |
11 | pop(key[,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。 |
12 | popitem() 随机返回并删除字典中的最后一对键和值 |
dict_a = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
for x,y in dict_a.items():
print("key=%s,value=%s" % (str(x),str(y)))
format_dict="%(year)d-%(month)d-%(day)d"
list_c = [{ "year":1998,
"month":12,
"day":12},
{"year":2000,
"month":11,
"day":11}]
for data in list_c:
print (format_dict % (data))
#1998-12-12
#2000-11-11
函数
def 函数名(参数列表):
函数体
例:
def func():
pass
def printpeople(name,age,height=170):
print("%s 's age=%s, height=%s" %(name,age,height))
printpeople("LCX","20","180")
printpeople("YXL","21")
#LCX 's age=20, height=180
#YXL 's age=21, height=170
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
def functionname( parameters ):
"函数_文档字符串"
function_suite
return [expression]
可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
- 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
- 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
python 函数的参数传递:
- 不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
- 可变类型:类似 c++ 的引用传递,如列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
传不可变类型:
def ChangeInt( a ):
a = 10
b = 2
ChangeInt(b)
print b
# 结果是 2
传可变类型:
def changeme( mylist ):
"修改传入的列表"
mylist.append([1,2,3,4])
print "函数内取值: ", mylist
return
mylist = [10,20,30]
changeme( mylist )
print "函数外取值: ", mylist
#函数内取值: [10, 20, 30, [1, 2, 3, 4]]
#函数外取值: [10, 20, 30, [1, 2, 3, 4]]
参数
- 必备参数:必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样
- 关键字参数:关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
- 默认参数:调用函数时,默认参数的值如果没有传入,则被认为是默认值。
- 不定长参数:要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数。
不定长参数
一:参数带一个星号 *基本语法如下:
#加了星号(*)的变量名以元组(tuple)的形式导入存放所有未命名的变量参数。。
def functionname([formal_args,] *var_args_tuple ):
"函数_文档字符串"
function_suite
return [expression]
例:
def printinfo( arg1, *vartuple ):
"打印任何传入的参数"
print ("输出: ")
print (arg1)
print (vartuple)
print ("总:",vartuple)
# 调用printinfo 函数
printinfo( 1, 2, 3, 4 )
#输出
#1
#2
#3
#4
#总: (2, 3, 4)
二:参数带两个星号 **基本语法如下:
#加了两个星号 ** 的参数会以字典的形式导入。
def functionname([formal_args,] **var_args_dict ):
"函数_文档字符串"
function_suite
return [expression]
例:
def printinfo( arg1, **vardict ):
"打印任何传入的参数"
print ("输出: ")
print (arg1)
print (vardict)
# 调用printinfo 函数
printinfo(1, a=2,b=3)
#输出:
#1
#{'a': 2, 'b': 3}
匿名函数
python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
lambda [arg1 [,arg2,.....argn]]:expression
例:
sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))
print ("相加后的值为 : ", sum( 20, 20 ))
强制位置参数
一个函数形参语法 / 用来指明在/符号之前函数形参必须使用指定位置参数,不能使用关键字参数的形式。单独出现星号 * 后的参数必须用关键字传入。
#形参 a 和 b 必须使用指定位置参数,c 或 d 可以是位置形参或关键字形参,而 e 或 f 要求为关键字形参:
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
f(10,20,30,40,e=50,f=60)
正则表达式
re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re.match(pattern, string, flags=0)
参数 | 描述 |
pattern | 匹配的正则表达式 |
string | 要匹配的字符串 |
flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 |
匹配对象方法 | 描述 |
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号 |
import re
line = "Cats are smarter than dogs"
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print ("searchObj.group() : ", searchObj.group())
print ("searchObj.group(1) : ", searchObj.group(1))
print ("searchObj.group(2) : ", searchObj.group(2))
else:
print ("Nothing found!!")
#searchObj.group() : Cats are smarter than dogs
#searchObj.group(1) : Cats
#searchObj.group(2) : smarter
re.search方法
re.search 扫描整个字符串并返回第一个成功的匹配。
re.search(pattern, string, flags=0)
参数同上
re.match与re.search的区别
re.match 只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None,而 re.search 匹配整个字符串,直到找到一个匹配。
compile 函数
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象
re.compile(pattern[, flags])
参数 | 描述 |
pattern | 一个字符串形式的正则表达式 |
flags 可选 | 表示匹配模式,比如忽略大小写,多行模式等 |
>>>import re
>>> pattern = re.compile(r'\d+') # 用于匹配至少一个数字
>>> m = pattern.match('one12twothree34four') # 查找头部,没有匹配
>>> print( m )
None
>>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配
>>> print( m )
None
>>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配
>>> print( m ) # 返回一个 Match 对象
<_sre.SRE_Match object at 0x10a42aac0>
>>> m.group(0) # 可省略 0
'12'
>>> m.start(0) # 可省略 0
3
>>> m.end(0) # 可省略 0
5
>>> m.span(0) # 可省略 0
(3, 5)
findall
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
re.findall(string[, pos[, endpos]])
参数 | 描述 |
string | 待匹配的字符串 |
pos | 可选参数,指定字符串的起始位置,默认为 0 |
endpos | 可选参数,指定字符串的结束位置,默认为字符串的长度 |
import re
pattern = re.compile(r'\d+') # 查找数字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)
print(result1)
print(result2)
#['123', '456']
#['88', '12']