什么是生成器:
生成器是一个’自定义‘的迭代器,本质是个迭代器
如何实现生成器:
自定义的迭代器
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}
'
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)