python之路第三天
一、集合
1、集合可以帮助列表进行去重操作
2、关系测试(两个列表中的集合)
1 # 设置集合 集合是必然去重的 2 list_1= {1, 2, 3, 9, 2, 4} # == list_1 = set([1,2,3,4]) 3 list_2= {1, 2, 9, 0, 10, 33} 4 list_3= {1, 2} 5 print(list_1,type(list_1)) 6 list_1=set(list_1) 7 print(list_1,type(list_1)) 8 9 # 关系测试 求交集 10 print(list_1.intersection(list_2)) 11 # 运算符的方式 12 print(list_1 & list_2) 13 14 # 求并集 15 print(list_1.union(list_2)) 16 # 运算符的方式 17 print(list_1 | list_2) 18 19 # 求差集 list1 中有的 list2 中没有的 取出来 20 print(list_1.difference(list_2)) 21 # 运算符的方式 22 print(list_1-list_2) 23 24 # 子集 判断list1 是否是 list2 的子集 返回真假 25 print(list_1.issubset(list_2)) 26 print(1,list_3.issubset(list_1)) 27 28 # 判断list 是否是 list2 的父集 返回 29 print(list_1.issuperset(list_2)) # False 30 print(2,list_2.issuperset(list_3)) # True list2 是 list3 的父集 31 32 # 对称差集 取出 list1 和 list2 都没有的值 33 print(list_1.symmetric_difference(list_2)) 34 # 运算符的方式 35 print(list_1 ^ list_2) 36 37 # 判断list1 和 list2 是否有交集 有返回False 没有返回True 38 print(list_1.isdisjoint(list_2)) 39 40 41 # 集合添加 42 43 list_1.add('a') # 添加一项 44 list_1.update(['b','s']) # 添加多项 45 46 # 删除 47 list_1.remove('a') # 删除一项 删除不存在的会报错 48 list_1.pop() # 删除一个随机的值 并返回他的值 无序删除 49 list_1.discard('bbb') # 删除一项 不存在返回None
二、文件读写
# 当文件是win生成的 需要进行转字符编码 # encoding="utf-8" 在开启的文件后面增加字符编码 f = open('file','r',encoding="utf-8") # read() 读取文件的全部内容 第二次读取无法读取到数据,因为已经到文件的最后一行了 print(f.read()) # 文件读写规范 r(读模式) w(写模式,是创建一个文件,同名就覆盖了) a(追加 append 加在文件的最后,同样不能读) f = open('file','w',encoding="utf-8") f = open('file','a',encoding="utf-8")
文件读写规范 r(读模式) w(写模式,是创建一个文件,同名就覆盖了) a(追加 append 加在文件的最后,同样不能读)
r+(读写,写是写在最后面 == r和a的组合) w+(写读 先创建一个文件在读 写也是在最后面写) (a+ 追加读写 可以写了)
rb(以二进制的格式读取这个文件) wb(二进制写 )
再循环取文件内容时尽量不要使用将文件存储到内存,在去循环他的方式如以下方式
for index,item in enumerate(f.readlines()): if index == 9: print('---------------------------') continue print(item)
可以采用下面的方式进行遍历
count=0 for line in f: if count == 9: print('---------') count+=1 continue print(line)
下面介绍几种文件的方法
tell() # 查看当前文件指针在那 按照字符的个数计数 seek(0) # 只能回到开头 因为你不知道第n行的字节数是多少 encoding() # 打印文件的字符集编码 fileno() # 返回文件句柄编号 readable() # 判断文件是否能读 返回真假
with open("yesterday", 'r', encoding="utf-8") as f: print(f.fileno()) # 返回文件句柄编号 print(f.readable()) # 判断文件是否能读 返回真假 print(f.writable()) # 判断文件是否可写 返回真假 print(f.flush()) # 默认等到缓存满了才会写到文件中 调用方法手动强制写入 buffer的size非常小 用于文件实时写入 print(f.truncate(10)) # 截断文件内容 无论移动到那里都是从头开始 不输入是从0开始 输入具体数字就从那个字节开始保留之前 后面全部干掉
这里带着写一个小的实用的例子,linux下的进度条如果用python实现 主要通过flush()这个方法 强制写到硬盘来实现
import sys, time # sys 中一个新的方法 标准输出方式 for i in range(10): sys.stdout.write('#') # 实现同行打印 引用sys模块的 stdout方法1 sys.stdout.flush() # 每次刷新强制从缓存写入硬盘平日年他 time.sleep(1) # 没循环一次 休眠1秒 让他有中进度条的感觉
三、字符集编码与转换

字符集的编码转换严格遵循上面这张图来进行在操作就不会懵逼,unicode被称为万国码,每个国家都的语法他都含有,utf-8是万国码的扩展集
字符编码的转换都是有规律的一个gbk的编码想转换成utf-8需要先转为unicode作为中间者,然后在转为utf-8
当然在转换时也要注意 解码decode成unicode 编码encode成你需要的字符集
同时、在decode和是需要告诉unicode你是什么字符来解码成unicode如下面代码
import sys print(sys.getdefaultencoding()) # 获取当前系统字符集 msg = "我爱北京天安门" # 这里可以看到我们解码(decode)成unicode,告诉他我们是utf-8转成unicode,紧接着我们又编码(encode) 这时我们需要告诉计算机,我们要编码的字符集 这里我们要编码成gb2312的格式 msg_gb2312 = msg.decode("utf-8").encode("gb2312") # ok 以后的字符集编码转换也就相通了,只要记住要们是以unicode来完成中间转换的就好 gb2312_to_gbk = msg_gb2312.decode("gbk").encode("gbk")
四、函数
函数分为面向三种
1、面向对象
2、面向过程
3、函数式编程
函数的特点是 重用(简化代码)、保持一致性、可扩展性
函数是有返回值的方法如下面代码
def demo_fuc(): # 函数有返回值 '''testing''' print("in the demo_fuc") demo1() return 0
过程是没有返回值的,如下面代码
def demo_fuc1(): # 过程是没有返回值的函数 '''testing1''' print("in the demo_fuc1") demo1()
函数之间的传参
形参和实参的区分
# 形参和实参是一一对应的 def demo_parameter(x, y): # x y 代表形参 print(x) print(y)
demo_parameter(1, 2) # 12是实参 这是位置参数调用 参数化与位置对应
参数的调用分为位置参数调用、关键字参数调用
demo_parameter(y=3, x=4) # 关键字调用 与形参顺序无关 demo_parameter(1, y=8) # 关键参数必须写在位置参数后面
Python中有默认参数的概念
# 默认参数 # 默认参数的特点:默认参数可有可无 非必填像 # 用途:默认安装值 True or false,数据库端口号 def default(x, y=3): # y 有默认参数 print(x) print(y)
Python中有参数组的概念
# 参数组*args # 参数组定义完单个* 转成元组 def parameter_group(*args): # 参数组 只接受N个位置参数 转换成元组的形式 print(args) parameter_group(1, 2.3, 3) def blend_parameter(x, *args): # 扩展参数 相传多少穿多少 args是规范 print(x) print(*args)
Python中还可以传key value 这种格式的参数 在形参写为**args
def dict_parameter(**args): # 将传的N个 关键字 参数转成字典的方式 关键字 print(args) print(args['name']) # 获取字典的value print(args['age']) dict_parameter(name='hyf', age=11)
各种参数的使用是有顺序的看下面代码
# 位置参数、默认参数、可变参数、关键字参数4种一起用的话,必须按照前面的顺序来使用 def All(name, age=18, *args, **kwargs): print(name) print(age) print(args) print(kwargs) All('houyafan', 1, 23)
高阶函数
def add(a,b,f): return f(a)+f(b) a=add(1,-2,abs()) # 将函数传进去去处理里面的值 没什么卵用 one day i can do it print(a)
五、局部变量
1、局部变量只在函数中生效, 这个函数就是这个变量的作用域
2、全局变量是在整个程序都生效的变量
3、函数中是不更改全局变量的 如果要更改需要声明global teacher
4、只有字符串和数字不能在函数里面更改
*****禁忌:不应该在函数里面更改全局变量*****
teacher = 'alxe' def chang_name(): global teacher # 声明更改全局变量 禁忌:不应该在函数里面更改全局变量 teacher = 'houyafan' print(teacher) chang_name() print(teacher)
六、递归
递归的定义
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,
所以,递归调用的次数过多,会导致栈溢出)
# 最简单的递归函数 def calc(x): print(x) if int(x/2) > 0: return calc(int(x/2)) print(x) calc(10)
第三天就到这里 加油 !!!!!!!
浙公网安备 33010602011771号