递归函数
# 递归函数:自己调自己 from sys import setrecursionlimit setrecursionlimit(10000) # def wahah(): # print('wahah') # wahah() # # wahah() # from sys import setrecursionlimit # setrecursionlimit(10000) # 可以设置递归深度,执行不到10万次,最大递归是10万次,可能因为内存溢出就结束了 lst=['a1','a2',['a11','a12',['b11','b12']]] # print(isinstance(lst,list)) # for i in lst: # if type(i) is list: # for j in i: # if isinstance(j,list): # for k in j: # print(k) # else: # print(j) # else: # print(i) # 函数方式取出所有内容 # def func(lst): # for i in lst: # if isinstance(i,list): # func(i) # else: # print(i) # func(lst) # 总结: # 什么时候用? # 一般程序每一层的逻辑是一样,只是数据不同,那这个时候我们就用递归函数 # l=[1,[88,80.2],4,[5,6,7,8,[6,3,2,1]]] #求和 # def func(s1): # for i in s1: # if type(i) is list: # for j in i: # if isinstance(j,list): #[88,80.2] [5,6,7,8,[6,3,2,1] # for k in j: #5,6,7,8 # if isinstance(k, list): # for g in k: # print(g) #6,3,2,1 # else: # print(k) # else: # print(j) #88,80.2 # # else: # print(i) #1,4 # # return i+j+k+g # # ret=func([1,[88,80.2],4,[5,6,7,8,[6,3,2,1]]]) # print(ret) count=0 def func(lst): for i in lst: global count if isinstance(i,list): func(i) else: count+=i # print(count) #1 return count ret=func([1,[88,80.2],4,[5,6,7,8,[6,3,2,1]]]) print(ret) def func(lst): cof isinstance(i,list): ret=func(i) count+=ret else: unt = 0 for i in lst: i count+=i return count ret=func([1,[88,80.2],4,[5,6,7,8,[6,3,2,1]]]) print(ret) # 为什么叫递归? # 往下叫递,往回叫归、
迭代器
#迭代器,可迭代的 # ret=range(10000) # iterator=ret.__iter__() 把它变成迭代器 # ret=range(5) # iterator=ret.__iter__() # # print(iterator) # print(iterator.__next__()) # print(iterator.__next__()) # print(iterator.__next__()) # 所谓迭代器就是从这个数据里面一个一个取值,没取之前不占内存空间 # 迭代器特点:1.一个一个取值,惰性机制,而不是一次性把所有的数据创建出来 # 2.只能按照顺序取值,不能跳过也不能回头 # 3.迭代器中的数据你不取去它就不会创建 # 4.一个迭代器中的数据只能从头到尾取一次 # # 可迭代协议:iter # 如果一个数据类型中有iter方法,那么这个数据就叫可迭代类型 # # 迭代器协议:iter+next # 如果一个数据类型中有iter方法也有next方法,那么这个数据类型就叫迭代器类型 # 可迭代的: # print('__iter__'in dir('hello')) #True # print('__iter__'in dir('432'))#True # print('__iter__'in dir(['432']))#True # print('__iter__'in dir((13,))#True # print('__iter__'in dir(42)) #False # 迭代器:目前学的所有数据类型都不是迭代器 # print('__next__'in dir(42)) #False # f=open('1.递归函数.py',encoding='utf-8') # print('__next__'in dir(f)) #True # 文件操作符是一个迭代器 # lst=[1,2,3,4] # iter=lst.__iter__() # print('__next__' in dir(iter)) # print(iter) # print(iter.__next__()) # print(iter.__next__()) # print(iter.__next__()) # print(iter.__next__()) # print(iter.__next__()) # 有什么用? # for 循环没有迭代器就迭代不了 # for 底层源代码 # 所有能被for循环的至少是一个可迭代的类型 # lst=[1,2,3,4] # iter=lst.__iter__() # while True: # try: # print(iter.__next__()) # except StopIteration: # break # # 生成器 # 生成器的本质就是一个迭代器 # 生成器函数 # 生成器表达式 # def func(): # print(111) # yield 222 # generator=func() # print(generator.__next__()) #生成器函数 # yield 作用和return 作用一样,返回数据 # yield 和return 区别: # yield 是分段来执行,一个函数,return 直接停止执行函数 # def func(): # print(111) # yield 222 # print(2222) # yield 3333 # print(3333) # yield 4444 # generator=func() # print(generator.__next__()) # print(generator.__next__()) # print(generator.__next__()) #send 方法 # def eat(): # print('吃什么') # a=yield '吃火锅' # print(a) # b=yield '吃窝窝头' # print(b) # c=yield '卷饼' # print(c) # gen=eat() # gen.__next__() # gen.send('胡辣汤') # gen.send('狗粮') # gen.send('苗亮') # send 和 next的区别: # 1.都是让生成器向下走一次 # 2.send是给上一个yield的位置传递值,但是不能给最后一个yield发送值,在第一次执行生成器代码的时候不能使用send() def eat(): print("反") a=yield "1" print("a",a) b=yield '2' print("b",b) c=yield '3' print("c",c) gen=eat() # print(gen) for i in gen: print(i)
各种推导式
# lat=[1,2,3,4] # lst=[] # for i in lat: # lst.append(i*2) # print(lst) # 列表推导式 # lst=[i*2 for i in lat] 结果 for 变量 in 可迭代对象 # print(lst) # lst2=[1,2,3,4,5,67,7,8] # lst2=[i for i in lst2 if i%2==0] # print(lst2) # 取100以内所有的偶数 # lst3=[i for i in range(100) if i%2==0] # print(lst3) # lst3=[i for i in range(100) if i%3==0] # print(lst3) # # # lst3=[i*i for i in range(100) if i/3==0] # print(lst3) names = [['Tom','Billy','Jefferson','Andrew','Webley','Steven'], ['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva'] ] new_lst2=[name for lst in names for name in lst if name.count('e')>=2] print(new_lst2) # 总结 [结果 for 变量 in 可迭代对象 if 条件筛选] # dic={'a':10,'b':20} # new={dic[key]:key for key in dic} # print(new) # 生成器表达式 # lst=[1,2,3,4,5] # gen=(i*2 for i in range(5)) # print(gen) #一种取值方式 # print(list(gen)) #列表取值 这个把gen值取完了 #for 循环另外一种取值方式 # for i in gen: # print(i) # 生成器是程序员能够自己写的迭代器 # 生成器函数 yield关键字 # 带yield关键字就是生成器函数 # 生成器表达式: # g=(表达式) # 所有的生成器都符合迭代器的特点 # 1.一个一个取值,而不是一次性把所有数据创建出来,生成器数据不取不创建 # 2.只能按照顺序取,不能跳过不能回头 # 3.一个生成器中的数据只能从头到尾取一次
三元运算符
#比如两个数比较大小,找到比较大的值 # a=10 # b=5 # count=0 # if a>b: # count=a # else: # count=b # print(count) # 三元运算符写法 a=10 b=5 count=a if a匿名函数# 什么叫匿名函数? # 如果一个函数的功能非常小,只有一句代码 # 这个时候我们可以把这个函数创建成一个匿名函数 # 匿名函数又叫lambda 表达式 # def func(a,b): # return a+b # # ret=func(1,2) # print(ret) # lambda 参数:返回值 # func2=lambda a,b :a+b # # print(func2(1,2)) # 看函数名字 # print(func2.__name__) # func=lambda a,b : a if a>b else a # # print(func(10,3)) # func=lambda a : a%2==0 # print(func(10)) # func=lambda a: '偶数' if a%2==0 else '奇数' # print(func(10)) # func=lambda a : a if a>0 else -a # print(func(-3)) # lambda 也可以不传参,这种比较冷门 func=lambda : -5 if -5>0 else --5 print(func())os模块import os # ret=os.path.getsize() 获取文件的大小 # ret1=os.path.dir() 判断路径是都是一个文件夹 # ret2=os.path.isfile() 判断路径是否是一个文件 # ret3=os.listdir() 查看当前文件夹下的所有文件 # 文件拼路径 #第一个参数是文件夹的名字,第二个参数可以是文件夹或文件名 # ret4=os.path.join(r'D:\study\day6\haha','day3') # print(ret4) # 文件夹相关操作 # os.mkdir('dir1') #已存在就不能再新建 # os.mkdir(r'D:\study\day 8\dir1') 通过绝对路径创建文件夹 # os.mkdir('dir1/dir2') #可以生成多层的递归目录 # os.rmdir('dir1') #删除单级目录,目录不能为空 # os.removedirs('dir1/dir2') #目录为空则删除,并递归到上一级的目录,若上一级目录也为空,则删除,以此类推 # 操作系统相关的 # ret=os.system('dir') # 查看所有的文件夹和文件 只执行,不关心结果,没有返回值,乱码改变不了 # print(ret) ret8=os.popen('dir') #执行并返回结果 # print(ret8) # print(type(ret8.read())) #转换成中文的读取方式 print(ret8.read().split('\n')) #读取并切割空格 # 将path 分割成目录和文件名的形式,以元组的形式返回 # ret=os.path.split(r'D:\study\day 8\1.递归函数.py') # print(ret) # # # os.rename() #重命名 # os.rename(r'原名字',r'新名字') 重命名 # # os.remove() #删除 # os.remove(r'文件名') 删除文件模块的分类# 模块的分类 # 内置模块:不需要安装,直接可以使用 # 扩展模块/第三方模块 :需要自己安装一下 # 自定义模块: 自己写的代码 import random # random 随机 # 随机的规则:在某一个范围内抽到的每一个值的概率都相同 # random 模块:生成随机数,处理随机数 #求0到1之间的随机数,永远取不到0和1,开区间 # ret=random.random() # print(ret) #求随机的整数,是闭区间,需要2个参数 # ret=random.randint(1,3) # print(ret) #求随机区间值 # ret=random.randrange(1,15,2) #左开右闭 # print(ret) # # start --指定范围开始值,包含在范围内 # stop --指定范围结束值,不包含在范围内 # step --指定递增基数 #打乱顺序(洗牌),一般洗牌用 lst=[1,2,3,4,5,6,7,8,9] # random.shuffle(lst) # print(lst) #随机抽取一个概率相等 微信摇骰子 ret=random.choice(lst) print(ret) # ret=random.sample(lst,3) #随机抽取多个 年会抽奖 # print(ret)# 1.列表推导式作业 # 例1: 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母 # l1 = ['Alice', 'Ji', 'An', 'Wendy', 'Jennifer', 'Sh', 'Eva'] # new_lst = [i.upper() for i in l1 if len(i) > 3] # print(new_lst) # 例2: 求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表 # lst=[(x,y) for x in range(6) if x%2 ==0 for y in range(6) if y%2 ==1] # print(lst) # 例3: 求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]] # M = [[1,2,3],[4,5,6],[7,8,9]] # m_lst=[i[-1] for i in M] # print(m_lst) # 2:页面显示 序号 + 商品名称 + 商品价格,如: # 1 电脑 1999 # 2 鼠标 10 # 3 游艇 20 # 4 美女 998 # 2:用户输入选择的商品序号,然后打印商品名称及商品价格 # 3:如果用户输入的商品序号有误,则提示输入有误,并重新输入。 # 4:用户输入Q或者q,退出程序。 # # goods = [{"name": "电脑", "price": 1999}, # {"name": "鼠标", "price": 10}, # {"name": "游艇", "price": 20}, # {"name": "美女", "price": 998}, ] # # while True: # for i in goods: # print(goods.index(i) + 1, i['name'], i['price']) # # content = input('请选择商品:') # if content.isdigit() and 0< int(content)