Python指令汇总(二)
- 四、函数
- 1.创建与调用函数
- 2.参数
- (1)形参与实参
- (2)关键字参数
- (3)默认参数
- (4)收集参数
- 3.函数文档
- 4.global关键字
- 5.nonlocal关键字
- 6. lambda表达式
- 7.filter()与map()
- filter()
- map()
- 五、集合与字典
- 1.字典
- (1)创建字典
- (2)内置方法
- fromkeys()
- key()、values()、items()
- get()和setdefault()
- clear()
- copy()
- pop()和popitem()
- update()
- 2.集合
- (1)创建集合
- (2)访问集合
- (3)不可变集合
- (4)内置方法
- 逻辑方法
- 对元素操作
- 六、文件
- 1.打开文件
- 2.文件方法
- close()
- read()与readline()
- tell()与seek()
- write()与writelines()
- 3.模块
- (1)OS模块
- getcwd()
- chdir(path)
- listdir(path='.')
- mkdir(path)
- makedirs(path)
- remove(path)、rmdir(path)、removedirs(path)
- rename(old, new)
- system(command)
- walk(path)
- 实用定义
- (2)os.path模块
- basename(path)与dirname(path)
- join(path1[,path2[,...]])
- split(path)与splitext(path)
- getsize(file)
- getatime(file)、getctime(file)、getmtime(file)
- exists(path)、isabs(path)、isdir(path)、isfile(path)、islink(path)、ismount(path)、samefile(path1,path2)
- (3)pickle模块
- dump(data,file)与load(file)
四、函数
1.创建与调用函数
创建:
def 函数名():
___函数内容
def nihao():
return 'Hello world'
调用:
函数名()
nihao()
'Hello world'
2.参数
使函数实现个性化
参数写在括号中,如有多个参数,使用括号隔开
>>> def nihao(name):
print(name + '好')
>>> nihao('你')
你好
>>> nihao('他')
他好
>>> def ai(name1,name2):
print(name1 + '爱' + name2)
>>> ai('我','你')
我爱你
(1)形参与实参
形参指函数创建和定义时小括号里的参数,实参指函数在调用过程中传递进来的参数。
(2)关键字参数
为了防止在使用函数时搞乱参数输入的顺序,导致函数无法按预期实现,可以使用关键字参数
>>> ai('我','你')
我爱你
>>> ai(name2='我',name1='你')
你爱我
(3)默认参数
在定义函数时赋予了默认值的参数
def ai(name1='我',name2='你'):
print(name1 + '爱' + name2)
>>> ai()
我爱你
>>> ai('他')
他爱你
>>> ai('我','他')
我爱他
(4)收集参数
当要输入的参数数量不确定时,在定义函数时使用收集参数,又称可变参数
使用时只需在参数前加*,实质上是将所有参数打包成一个元组
>>> def test(*params):
print('有%d个参数'%len(params))
print('第二个参数是:',params[1])
>>> test('hello','world')
有2个参数
第二个参数是: world
如果在收集参数后还有其他参数需要指定,在调用函数时就应该使用关键参数,否则都会被列入收集参数中。也可以将其他参数都设置为默认参数。
3.函数文档
函数的注释,让其他人更好的理解函数
用三对引号括起来
可以用 函数名._ _doc _ _ 和help()函数读取查看
>>> def ai(name1,name2):
'''name1爱name2
爱不能随便说
'''
print(name1 + '爱' + name2)
>>> ai.__doc__
'name1爱name2\n\t爱不能随便说\n\t'
>>> help(ai)
Help on function ai in module __main__:
ai(name1, name2)
name1爱name2
爱不能随便说
4.global关键字
在函数内部修改全局变量
>>> count = 10
>>> def example():
count = 5
print(count)
>>> example()
5
>>> count
10
>>> count = 10
>>> def example():
global count
count = 5
print(count)
>>> example()
5
>>> count
5
5.nonlocal关键字
在内部函数里修改外部函数里局部变量的值
>>> def f1():
x = 5
def f2():
x *= x
return x
return f2
>>> f1()()
Traceback (most recent call last):
File "<pyshell#64>", line 1, in <module>
f1()()
File "<pyshell#63>", line 4, in f2
x *= x
UnboundLocalError: local variable 'x' referenced before assignment
>>> def f1():
x = 5
def f2():
nonlocal x
x *= x
return x
return f2
>>> f1()()
25
6. lambda表达式
创建匿名函数
>>> def f1(x):
return 2 * x + 1
>>> f1(5)
11
>>> g = lambda x: 2 * x + 1
>>> g(5)
11
7.filter()与map()
filter()
过滤器
有两个参数,第一个参数可以是一个函数,也可以是None。如果是函数,就把第二额可迭代数据里的每一个元素作为函数的参数运算,把返回值为True的值筛选出来;如果是None,则直接把第二个参数中为True的值筛选出来。
>>> list(filter(lambda x:x % 2,range(10)))
[1, 3, 5, 7, 9]
map()
映射
有两个参数,一个是函数,一个是可迭代序列,将序列的每一个元素作为函数的参数进行运算加工,知道可迭代序列的每一个元素都加工完毕,返回所有加工后的元素构成。
>>> list(map(lambda x:x * 2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
五、集合与字典
1.字典
(1)创建字典
直接创建
dict1 = {'1*1':1,'2*2':4,'3*3':9}
dict1
{'1*1': 1, '2*2': 4, '3*3': 9}
empty = {}
empty
{}
type(empty)
<class 'dict'>
使用dict()
dict1 = dict((('A',65),('B',66),('C',67),('D',68),('E',69)))
dict1
{'A': 65, 'B': 66, 'C': 67, 'D': 68, 'E': 69}
dict1 = dict(A = 65,B = 66,C = 67,D = 68,E = 69)
dict1
{'A': 65, 'B': 66, 'C': 67, 'D': 68, 'E': 69}
dict1 = dict(zip(['one','two','three'],[1,2,3]))
dict1
{'one': 1, 'two': 2, 'three': 3}
给键赋值
如果键不存在,创建一个新的键并赋值;如果键存在,则改写键对应的值
dict1
{'one': 1, 'two': 2, 'three': 3}
dict1['four'] = 4
dict1
{'one': 1, 'two': 2, 'three': 3, 'four': 4}
dict1['four'] = 'IV'
dict1
{'one': 1, 'two': 2, 'three': 3, 'four': 'IV'}
(2)内置方法
fromkeys()
创建并返回一个新的字典,它有两个参数,第一个参数是字典的键,第二个参数是可选的,是传入建对应的值,如果不提供,那么默认是None
dict1 = {}
dict1.fromkeys((1,2,3))
{1: None, 2: None, 3: None}
dict2 = {}
dict2.fromkeys((1,2,3),'Number')
{1: 'Number', 2: 'Number', 3: 'Number'}
dict3 = {}
dict3.fromkeys((1,2,3),('one','two','three'))
{1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
fromkeys()方法并不会把三个值分别赋给各个键,而是整体赋值
key()、values()、items()
keys()返回字典中所有的键,values()返回字典中所有的值,items()返回字典中所有的键值对
dict1 = {}
dict1 = dict1.fromkeys(range(6),'你好')
dict1.keys()
dict_keys([0, 1, 2, 3, 4, 5])
dict1.values()
dict_values(['你好', '你好', '你好', '你好', '你好', '你好'])
dict1.items()
dict_items([(0, '你好'), (1, '你好'), (2, '你好'), (3, '你好'), (4, '你好'), (5, '你好')])
get()和setdefault()
访问字典项时,可以直接访问,输入键会返回对应的值。当输入的键不存在时,会发生错误
dict1
{'one': 1, 'two': 2, 'three': 3}
dict1['one']
1
dict1['four']
Traceback (most recent call last):
File "<input>", line 1, in <module>
KeyError: 'four'
get()也是用来访问字典项,但如果输入的键不存在,不会报错,而是返回None。如果希望找不到是返回对应的值,可以在第二个参数设置对应的默认返回值
dict1.get('two')
2
dict1.get('four')
dict1.get('four','没有')
'没有'
setdefault()方法与get()方法有些类似,但setdefault()在字典中找不到相应的键时会自动添加
dict1
{1: 'one'}
dict1.setdefault(1)
'one'
dict1.setdefault(2)
dict1
{1: 'one', 2: None}
clear()
清空一个字典
清空一个字典也可以通过为变量名赋值一个空字典的方法进行,但有一定的弊端
dict1
{'one': 1}
dict2 = dict1
dict2
{'one': 1}
dict1.clear()
dict1
{}
dict2
{}
dict2 = dict1
dict1
{'one': 1}
dict2
{'one': 1}
dict1 = {}
dict1
{}
dict2
{'one': 1}
当试图通过将dict1指向一个空字典来达到清空效果时,原来的字典并没有真正被清空。
copy()
复制字典,而不是指向一个字典
dict1 = {'one':1}
dict2 = dict1.copy()
id(dict1)
59300232
id(dict2)
59300752
dict1['one'] = '一'
dict1
{'one': '一'}
dict2
{'one': 1}
pop()和popitem()
pop()是给定键弹出一个对应的值,popitem()则是弹出一个项
dict1 = {1:'one',2:'two',3:'three',4:'four'}
dict1.pop(2)
'two'
dict1
{1: 'one', 3: 'three', 4: 'four'}
dict1.popitem()
(4, 'four')
dict1
{1: 'one', 3: 'three'}
popitem()是随机弹出,无法指定项,也不是弹出最后一项,因为在字典中项没有顺序
update()
将另一个字典中的键值对更新到字典中
dict1
{1: 'one', 2: None}
dict1.update({2:'two'})
dict1
{1: 'one', 2: 'two'}
2.集合
用大括号将数据括起来但不体现映射特性就是集合,集合会把所有重复的数据清理掉。集合是无序的,不能索引集合中的某个元素
a = {1,2,3,4,5,6,3,5,2,1,9,'你好','你好','我好'}
a
{1, 2, 3, 4, 5, 6, '我好', 9, '你好'}
a[2]
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'set' object is not subscriptable
(1)创建集合
创建集合可以使用{}把所有元素括起来,也可以使用set()
set1 = {1,2,3,4}
set2 = set([1,2,3,4])
set1 == set2
True
(2)访问集合
由于集合中元素无序,所以不能像序列那样用下标进行访问,但可以使用迭代方法把集合中的数据依次读取
set1
{1, 2, 3, 4}
for each in set1:
print(each,end = ' ')
1 2 3 4
也可以使用 in 和 not in 判断一个元素是否在集合中存在
1 in set1
True
5 in set1
False
6 not in set1
True
(3)不可变集合
使用frozenset()函数可以使集合像元组一样不能随意地增加删除集合中的元素
set1 = frozenset({1,2,3,4,5,6})
set1.add(7)
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'
(4)内置方法
逻辑方法
s.issubset(t)
子集测试:s是否是t的子集
s = {1,2,3}
t = {1,2,3}
s.issubset(t)
True
t = {1,2,4}
s.issubset(t)
False
s.issuperset(t)
超集测试:s是否是t的超集
t = {1,2,3}
s = {1,2,3}
s.issuperset(t)
True
t = {1,2,4}
s.issuperset(t)
False
s.union(t)
合并操作
s
{1, 2, 3}
t
{1, 2, 4}
s.union(t)
{1, 2, 3, 4}
s.intersection(t)
交集操作
s
{1, 2, 3}
t
{1, 2, 4}
s.intersection(t)
{1, 2}
s.difference(t)
差分操作:在s中存在,但在t中不存在的元素
s
{1, 2, 3}
t
{1, 2, 4}
s.difference(t)
{3}
s.symmetric_difference
对称差分操作:s或t中的元素,但不是s和t共有的元素
s
{1, 2, 3}
t
{1, 2, 4}
s.symmetric_difference(t)
{3, 4}
s.copy
返回s的拷贝(浅复制)
t = s.copy()
t
{1, 2, 3}
s
{1, 2, 3}
对元素操作
s.update(t)
将t中的元素添加到s中
s
{1, 2, 3}
t
{1, 2, 4}
s.update(t)
s
{1, 2, 3, 4}
s.intersection_update(t)
交集修改操作:s中仅包括s和t中共有的元素
s
{1, 2, 3}
t
{1, 2, 4}
s.intersection_update(t)
s
{1, 2}
s.difference_update(t)
差修改操作:s中仅包括属于s但不属于t的元素
s
{1, 2, 3}
t
{1, 2, 4}
s.difference_update(t)
s
{3}
s.symmetric_difference_update(t)
对称差分修改操作:s中包括仅属于s或仅属于t的元素
s
{1, 2, 3}
t
{1, 2, 4}
s.symmetric_difference_update(t)
s
{3, 4}
s.add(obj)
加操作
s = {1,2,3}
s.add(4)
s
{1, 2, 3, 4}
s.remove(obj)
删除操作:将obj从s中删除,如果s中不存在obj,将引发异常
s
{1, 2, 3, 4}
s.remove(4)
s
{1, 2, 3}
s.remove(4)
Traceback (most recent call last):
File "<input>", line 1, in <module>
KeyError: 4
s.discard(obj)
丢弃操作:将obj从s中删除,如果s中不存在obj,无事发生
s
{1, 2, 3}
s.discard(3)
s
{1, 2}
s.discard(3)
s
{1, 2}
s.pop()
弹出操作:移除并返回s中的一个元素
s = {1,2,3}
s.pop()
1
s
{2, 3}
s.clear
清除操作:清除s中的所有元素
s
{2, 3}
s.clear()
s
set()
六、文件
1.打开文件
使用open()来打开文件并返回文件对象:
open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
第一个参数是要打开的文件名,第二个参数指定文件打开模式(默认rt)
打开模式 | 执行操作 |
‘r’ | 以只读方式打开文件(默认) |
‘w’ | 以写入的方式打开文件,会覆盖已存在的文件 |
‘x’ | 如果文件已经存在,使用此模式打开将引发异常 |
‘a’ | 以写入模式打开,如果文件存在,则在末尾追加写入 |
‘b’ | 以二进制模式打开文件 |
‘t’ | 以文本模式打开(默认) |
‘+’ | 可读写模式(可添加到其他模式中使用) |
‘U’ | 通用换行符支持 |
使用总结
- 确定要打开的文件存在(不存在使用会报错)
1、只读文本文件 r
2、只读非文本文件 rb
3、既读又写 r+或rb+ - 不确定要打开的文件是否存在。如果不存在,创建并打开;如果存在,打开并替换内容
1、只写文本文件 w
2、只写非文本文件 wb
3、既读又写 w+或wb+ - 不确定要打开的文件是否存在。如果不存在,创建并打开;如果存在,追加写入
1、只写文本文件 a
2、只写非文本文件 ab
3、既读又写 a+或ab+
2.文件方法
close()
关闭文件
因为在python中有垃圾收集机制,忘记关闭文件并不会造成十分严重的后果,但为了防止意外断电等的发生,还是要即使关闭文件
read()与readline()
读取文件
read以字节为单位进行读取,如果不设置参数,,会将全部内容读取
f = open('D:/pycharm/prj/面朝大海春暖花开.txt')
f.read(5)
'从明天起,'
f.read()
'做一个幸福的人\n喂马、劈柴,周游世界\n从明天起,关心粮食和蔬菜\n我有一所房子,面朝大海,春暖花开\n\n从明天起,和每一个亲人通信\n告诉他们我的幸福\n那幸福的闪电告诉我的\n我将告诉每一个人\n\n给每一条河每一座山取一个温暖的名字\n陌生人,我也为你祝福\n愿你有一个灿烂的前程\n愿你有情人终成眷属\n愿你在尘世获得幸福\n我只愿面朝大海,春暖花开'
readline在文件中读取一整行,就是从文件指针的位置开始向后读取,直到遇到换行符(\n)结束
f.seek(4,0)
4
f.read(1)
'天'
f.readline()
'起,做一个幸福的人\n'
tell()与seek()
seek()方法可以调整文件指针的位置,有两个参数,第一个参数表示偏移的字节数,第二个参数表示原本位置,0代表文件起始位置,1代表当前位置,2代表文件末尾。因此想让指针指到文件起始处,只需使用seek(0,0)
要注意的是,如果文件中有中文,一个汉字占用两个字节,如果使用seek方法时将指针放到了一个汉字中间,之后再read时就会出现错误
tell()方法返回当前文件指针的位置
f.tell()
26
f.seek(0,0)
0
f.tell()
0
f.seek(10,0)
10
f.tell()
10
另外注意,只有使用b打开的文件,才可以在seek方法中使用1,2,否则会报错,如下:
f.seek(10,1)
Traceback (most recent call last):
File "<input>", line 1, in <module>
io.UnsupportedOperation: can't do nonzero cur-relative seeks
write()与writelines()
write()方法将字符串写入文件中,writelines()方法将字符串序列seq写入文件中,seq是一个返回字符串的可迭代对象
f = open('D:/pycharm/prj/面朝大海春暖花开.txt','a+')
f.write('你好你好')
4
f.seek(0,0)
0
f.read()
'从明天起,做一个幸福的人\n喂马、劈柴,周游世界\n从明天起,关心粮食和蔬菜\n我有一所房子,面朝大海,春暖花开\n\n从明天起,和每一个亲人通信\n告诉他们我的幸福\n那幸福的闪电告诉我的\n我将告诉每一个人\n\n给每一条河每一座山取一个温暖的名字\n陌生人,我也为你祝福\n愿你有一个灿烂的前程\n愿你有情人终成眷属\n愿你在尘世获得幸福\n我只愿面朝大海,春暖花开你好你好'
a = ['窗前明月光','疑是地上霜']
f.writelines(a)
f.seek(0,0)
0
f.read()
'从明天起,做一个幸福的人\n喂马、劈柴,周游世界\n从明天起,关心粮食和蔬菜\n我有一所房子,面朝大海,春暖花开\n\n从明天起,和每一个亲人通信\n告诉他们我的幸福\n那幸福的闪电告诉我的\n我将告诉每一个人\n\n给每一条河每一座山取一个温暖的名字\n陌生人,我也为你祝福\n愿你有一个灿烂的前程\n愿你有情人终成眷属\n愿你在尘世获得幸福\n我只愿面朝大海,春暖花开你好你好窗前明月光疑是地上霜'
3.模块
(1)OS模块
使用前记得import os
getcwd()
返回当前工作目录
os.getcwd()
'D:\\pycharm\\p31'
chdir(path)
改变工作目录
os.chdir('D:\\pycharm\\p30')
os.getcwd()
'D:\\pycharm\\p30'
listdir(path=’.’)
列举指定目录中的文件名,默认参数是’.’,代表根目录,也可以使用’. .'代表上一层目录
os.listdir()
['.idea', 'my_liat.pkl', 'venv']
mkdir(path)
创建单层目录,如该目录已存在抛出异常
os.mkdir('test')
os.listdir()
['.idea', 'my_liat.pkl', 'test', 'venv']
os.mkdir('test')
Traceback (most recent call last):
File "<input>", line 1, in <module>
FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'test'
makedirs(path)
创建多层目录如该目录已存在抛出异常
os.makedirs(r'test\test1')
os.listdir('test')
['test1']
os.makedirs(r'test\test1')
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "D:\python\lib\os.py", line 221, in makedirs
mkdir(name, mode)
FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'test\\test1'
remove(path)、rmdir(path)、removedirs(path)
remove()用于删除文件
rmdir()用于删除单层目录,如目录非空则抛出异常
removedir()用于删除多层目录,从子目录到父目录逐层尝试删除,如目录非空则抛出异常
rename(old, new)
将文件old重命名为new
system(command)
运行系统的shell命令
os.system('calc')
0
walk(path)
遍历路径下所有子目录,将结果返回一个三元组(路径,[包含目录],[包含文件])
for i in os.walk('D:\\1111111'):
... print(i)
...
('D:\\1111111', ['Knives.Out.2019.1080p.BluRay.x264-YOL0W', 'Perfect.Strangers.2016.720p.BluRay.x264.WiKi', 'Singer.2020.S08.1080p.WEB-DL.H264.AAC-TJUPT'], ['La.La.Land.2016.1080p.BluRay.DTS-ES.x264-NCmt.mkv', 'vedioList.txt'])
('D:\\1111111\\Knives.Out.2019.1080p.BluRay.x264-YOL0W', [], ['knives.out.2019.1080p.bluray.x264-yol0w.mkv'])
('D:\\1111111\\Perfect.Strangers.2016.720p.BluRay.x264.WiKi', ['Sample'], ['Perfect.Strangers.2016.720p.BluRay.x264.WiKi.md5', 'Perfect.Strangers.2016.720p.BluRay.x264.WiKi.mkv', 'Perfect.Strangers.2016.720p.BluRay.x264.WiKi.nfo'])
('D:\\1111111\\Perfect.Strangers.2016.720p.BluRay.x264.WiKi\\Sample', [], ['Perfect.Strangers.2016.720p.BluRay.x264.WiKi.Sample.mkv'])
('D:\\1111111\\Singer.2020.S08.1080p.WEB-DL.H264.AAC-TJUPT', [], ['Singer.2020.S08E02.1080p.WEB-DL.H264.AAC-TJUPT.mp4', 'Singer.2020.S08E03.1080p.WEB-DL.H264.AAC-TJUPT.mp4'])
实用定义
os.curdir 指代当前目录(’.’)
os.pardir 指代上一级目录(’. .’)
os.sep 输出操作系统特定的路径分隔符(Windows下为“\\”,Linux下为“/”)
os.linesep 当前平台使用的行终止符(Windows下为“\r\n”,Linux下为“\n”)
os.name 指代当前使用的操作系统(包括‘posix’,‘nt’,‘mac’,‘os2,’,‘ce’,‘java’)
(2)os.path模块
basename(path)与dirname(path)
前者去掉目录路径,单独返回文件名;后者去掉文件名,单独返回目录路径
join(path1[,path2[,…]])
将各部分组合成一个路径名
split(path)与splitext(path)
split:分割文件名与路径,返回(f_path,f_name)元组。即使完全使用目录而没有文件名,该函数也会把最后一个目录与之前的目录分离,不会去区分目录与文件名
splitext:分离文件名与扩展名,返回(f_name,f_extension)元组
getsize(file)
返回文件的尺寸,单位为字节
getatime(file)、getctime(file)、getmtime(file)
分别为返回文件最近的访问时间、创建时间与最新的修改时间,返回值均为浮点型秒数,可以使用time模块的gmtime()(格林威治天文台时间)与localtime()(当地时间)函数换算
exists(path)、isabs(path)、isdir(path)、isfile(path)、islink(path)、ismount(path)、samefile(path1,path2)
分别为判断指定路径是否存在;指定路径是否为绝对路径;指定路径是否存在且是一个目录;指定路径是否存在且是一个文件;指定路径是否存在且是一个符号链接;指定路径是否存在且是一个挂载点;两个路径是否指向同一个文件
符号链接在Windows中就是快捷方式,挂载点在Windows中就是盘符(如C,D,E)
(3)pickle模块
dump(data,file)与load(file)
dump将数据永久保存到文件中,load将文件中的数据加载
打开文件时必须用’b’二进制模式