什么是生成器:
生成器是一个’自定义‘的迭代器,本质是个迭代器
如何实现生成器:自定义的迭代器
def func(): print("from func") yield 1 res = func() print(res._next_) 运行结果:from func 当我们通过_next_取值时才会执行函数体代码yield:
每一次yield都会往生成器里面添加一个值
只能在函数内部定义
yield可以保存函数的暂停状态
但凡在函数内部定义了的yield,调用函数时函数体代码不会执行,会返回一个结果,该结果就是一个生成器
yield与return的区别:
相同点:
返回值都是无限制的
不同点:
return 只能返回一个值
yield 能返回多个值
python2中:range(1,5) ——————>[1,2,3,4]
python3中:range(1,5) ———————>range对象——————>生成器
创建一个自定义生成器,自定义range功能 def my_range(start,end,move=1): while start <end: yield start start += move 面向过程编程面向过程编程是一门编程思想
核心是过程 ————————>指的是一种解决问题的步骤一种机械式的思维方式
优点:
将复杂的问题流程化,进而简单化
缺点:
若修改当前程序设计的某一部分,会导致其他部分同时需要修改,拓展性差
# # 1.先让用户输入用户名和密码,用户角色,校验合法性 def get_user_pwd_role(): while True: # 先让用户输入用户名 username = input(\'请输入用户名:\').strip() # 对用户名进行校验,校验是否是字母或中文 if username.isalpha(): break else: print(\'用户名不合法!\') while True: # 让用户输入密码 password = input(\'请输入密码:\').strip() re_password = input(\'请再次输入密码:\').strip() # 校验两次输入的密码是不是一致 if password == re_password: break else: print(\'两次输入的密码不一致!\') user_role = input(\'请输入您的用户角色:\').strip() return username, password, user_role # # 2.拼接用户字符串 def cut_user_pwd_role(username, password, user_role): user_pwd_role_str = f\'{username}:{password}:{user_role}\n\' return user_pwd_role_str, username # # 3.保存用户数据,写入文件中 def save_data(user_pwd_role_str, username): with open(f\'{username}.txt\', \'w\', encoding=\'utf-8\') as wf: wf.write(user_pwd_role_str) # # 注册功能Demo # def register(): # # 1.设计先让用户输入用户名和密码,用户角色,校验合法性,得到合法的用户名与密码 # user, pwd = get_user_pwd() # # # 2.设计字符串的拼接, 得到拼接好的字符串 # user_pwd_str = cut_user_pwd(user, pwd) # # # 3.开始写入文件 # save_data(user_pwd_str) # def register(): username, password, user_role = get_user_pwd_role() user_pwd_role_str, username = cut_user_pwd_role(username, password, user_role) save_data(user_pwd_role_str, username) register() root:root:普通用户 三元表达式:可以将 if...else...分支变成一行
语法
条件成立时返回左边的值,if判断条件,else条件不成立时返回右边的值
求两个值的大小: def max(num1,num2) return num1 else: return num2 res = num1 if num1>num2 else num2 条件成立时,返回左边的值;条件不成立时,返回右边的值 列表生成式:将list中的值,依次取值,添加到new_list中
可以一行实现生成列表
语法:
[值 for 可迭代对象中取出的每一个值 可迭代对象 + if 判断]
for 的右边是循环次数,并且可以取出可迭代对象中的每个值
for的左边可以为当前列表添加值
[line for line in range(1,101)] [f\'1{line}\' for line in range(1,101)] 生成器表达式(生成器生成式): 生成器生成式:若数据量大时采用
()——————>返回生成器
(lline for line in range(1,6))
优点:节省资源 缺点:取值不便
列表生成式:若数据量小时采用
[line for line in range(1,6)]
缺点:浪费资源 优点:可以依赖索引取值
匿名函数:
无名字的函数 lambda
有名函数:
def func():
pass
匿名(1,return 已经自动添加了)
lamdba 匿名() : return 1
lambda : 1 左边是参数,右边是返回值
需要一次性使用
单独使用将毫无意义,它必须配合内置函数才有意义
内置函数:python内部提供的内置方法
max,min,sorted
max求最大值 max(可迭代对象)
max内部会通过可迭代对象进行for循环取出,每个值,进行比较
获取dict1中薪资最大的人的名字 dict1={ \'tank\' :100, \'egon\' :500, \'sean\' :200, \'jason\' :50 } max(dict1)比较的是ascii中的字符串大小 max(dict1, key=lambda x:dict[x])sorted
进行 排序
默认升序(从小到大)
reverse 默认是false (从大到小)
将dict1中的名字根据薪资进行排序(由小到大) sorted(dict1,key=lambda x:dict1[x]) (由大到小) res = sorted(dict1, key=lambda x: dict1[x],reverse=True)