列表生成式
生成器
1:什么是生成器?
生成的工具
生成器是一个“自定义”的迭代器,本质上是一个迭代器
2:如果实现生成器
单反在函数内部定义了yield
调用函数时,函数体代码不会执行
会返回一个结果,该结果就是一个生成器
yield:
每一次yield都会往生成器对象中添加一个值
yield只能在函数内部定义
yield可以保存函数的暂停状态
yield与return:
相同点:返回值的个数都是无限制的
不同点:return只能返回一次值,yield可以返回多个值
# 可迭代对象
list1 = [1, 2, 3, 4.]
# 迭代器对象 python内置生成的迭代器
iter_list = list1.__iter__()
print(iter_list)
<list_iterator object at 0x000002C8661A8188>
自定义的迭代器
def func():
print('from func')
yield 'tank'
res = func()
# 当我们通过__next__取值时,才会执行函数体代码。
print(res.__next__())
def func():
print('开始准备下蛋')
print('1---火鸡蛋')
yield '火鸡蛋1'
print('2---火鸡蛋')
yield '火鸡蛋2'
print('3---火鸡蛋')
yield '火鸡蛋3'
print('取最后一个蛋,查看是否有')
res = func()
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
Traceback (most recent call last):
File "C:/Users/ever/PycharmProjects/untitled/oldboy/正式开班/day13/生成器.py", line 16, in <module>
开始准备下蛋
print(res.__next__())
1---火鸡蛋
StopIteration
火鸡蛋1
2---火鸡蛋
火鸡蛋2
3---火鸡蛋
火鸡蛋3
取最后一个蛋,查看是否有
自定义range功能,创建一个自定义的生成器
def my_range(start, end, move=1):
while start < end:
yield start
start += move
for line in my_range(1, 5, 2):
print(line)
1
3
面向过程编程
思想!!!
面向过程编程是一门编程思想
面向过程编程:
核心是“过程”二字,过程指的是一种解决问题的步骤,即先干什么再干什么
基于该编程思想编写程序,就好比在一个设计一条工厂流水线,一种机械式的思维模式
优点:将复杂的问题流程化,进而简单化
缺点:若修改当前程序设计的某一部分,会导致其他部分同时需要修改,扩展性差。
牵一发而动全身,扩展性差
实例:
# 1.先让用户输入用户名和密码,校验合法性
def get_user_pwd():
while True:
# 让用户输入用户名与密码
username = input('请输入用户名:').strip()
# 校验用户名是否为 英文字母 str.isalpha 校验英文字母、中文
if username.isalpha():
break
else:
print('用户名不合法')
while True:
password = input('请输入密码:').strip()
re_password = input('请确认密码:').strip()
# 校验两次密码是否一致
if password == re_password:
break
else:
print('两次密码不一致。')
return username, password
# 2.拼接用户字符串
def cut_user_pwd(user, pwd):
user_pwd_str = f'{user}:{pwd}\n'
return user_pwd_str
# 3.保存用户数据,写入文件中
def save_data(user_pwd_str):
with open('user.txt', 'a', encoding='utf-8') as f:
f.write(user_pwd_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)
register()
请输入用户名:tank
请输入密码:123
请确认密码:123
查看文件会有创建数据
ever:123
tank:123
添加一个功能,发现可扩展性差
# 1.先让用户输入用户名和密码、用户角色,校验合法性
def get_user_pwd():
while True:
# 让用户输入用户名与密码
username = input('请输入用户名:').strip()
# 校验用户名是否为 英文字母 str.isalpha 校验英文字母、中文
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(user, pwd, user_role):
user_pwd_str = f'{user}:{pwd}:{user_role}\n'
return user_pwd_str, user
# user = 'tank'
# user_name = user
# 3.保存用户数据,写入文件中
# 每一个用户保存一个文件,以用户的名字当做文件名
def save_data(user_pwd_str, user_name):
with open(f'{user_name}.txt', 'w', encoding='utf-8') as f:
f.write(user_pwd_str)
# 注册功能Demo
def register():
# 1.设计先让用户输入用户名和密码,校验合法性,得到合法的用户名与密码
user, pwd, user_role = get_user_pwd()
# 2.设计字符串的拼接, 得到拼接好的字符串
user_pwd_str, user_name = cut_user_pwd(user, pwd, user_role)
# 3.开始写入文件
save_data(user_pwd_str, user_name)
register()
请输入用户名:liuxuan
请输入密码:123
请确认密码:123
请输入用户角色:普通用户
查看文件会生成用户名命名的文件
liuxuan:123:普通用户
三元表达式
可以将if ...else...分支变成一行
语法:条件成立返回左边的值if判断条件else条件不成立返回右边的值
常规的模式
if 判断条件:
执行
else:
执行
求两个值的大小
通过if...else
def max2(num1, num2):
if num1 > num2:
return num1
else:
return num2
res = max2(10, 20)
print(res)
20
def max2(num1, num2):
if num1 > num2:
return num1
else:
return num2
res = max2(100, 20)
print(res)
100
用三元表达式求
num1 = 10
num2 = 20
def max2(num1, num2):
res = num1 if num1 > num2 else num2
return res
res = max2(num1, num2)
print(res)
20
需求: 让用户输入用户名,输入的用户如果不是tank,为其后缀添加_DSB
username = input('请输入用户名:').strip()
new_username = username if username == 'tank' else username + '_DSB'
print(new_username)
请输入用户名:hcy
hcy_DSB
列表生成式:
可以一行实现生成列表
语法:
list= [取出的每一个值、任意值 for 可迭代对象中取出的每一个值 in 可迭代对象]
for的右边式循环次数,并且可以取出可迭代对象中的每一个值
for的左边可以为当前列表添加值
list = [值 for 可迭代对象中取出的每一个值 in 可迭代对象]
list = [值 for 可迭代对象中取出的每一个值 in 可迭代对象 if 判断]
实例:
将list1中的值,依次取出,添加到new_list中
普通方式
list1 = [1, 2, 3, 4]
new_list = []
for line in range(1, 11):
new_list.append(line)
print(new_list)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Demo: 将name_list列表中的每一个人后缀都添加_dsb
name_list = ['jason', '饼哥(大脸)', 'sean', 'egon']
new_name_list = [name + '_dsb' for name in name_list]
print(new_name_list)
['jason_dsb', '饼哥(大脸)_dsb', 'sean_dsb', 'egon_dsb']
将name_list列表中的tank过滤掉,其他人后缀都添加_dsb
name_list = ['jason', '饼哥(大脸)', 'sean', 'egon', 'tank']
new_name_list = [name + '_dsb' for name in name_list if not name == 'tank']
print(new_name_list
['jason_dsb', '饼哥(大脸)_dsb', 'sean_dsb', 'egon_dsb']
生成器表达式(生成器生成式)
列表生成式:若数据量小时采用
[line for line in range(1, 6)] ---> [1, 2, 3, 4, 5]
优点:可以依赖于索引取值,取值方便
缺点:浪费资源
生成器生成式:若数据量过大时采用
()---> 返回生成器
(line for line in range(1, 6)) ---> g生成器(1, 2, 3, 4, 5)
优点:节省资源
缺点:取值不方便
生成一个有100个值得生成器
g = (line for line in range(1, 1000001))
# <generator object <genexpr> at 0x00000203262318E0>
print(g)
<generator object <genexpr> at 0x000001BB0E0D5248>
列表生成式实现
list1 = [line for line in range(1, 11)]
print(list1)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
匿名函数:
无名字的函数
lambda :
:左边是参数,右边是返回值
ps:原因,因为没有名字,函数的调用 函数名 + ()
匿名函数需要一次性使用
注意:匿名函数单独使用毫无意义,它必须配合“内置函数”一起使用的才有意义
有名函数:
有名字的函数
有名函数
def func():
return 1
print(func()) # func函数对象 + ()
print(func())
匿名函数
def ():
pass
() # + ()
匿名(), return 已经自动添加了
lambda 匿名():return 1
func = lambda : 1
print(func())
func = lambda : 1
print()
内置函数
range()
print()
len()
python 内部提供的内置方法
max,min,sorted,map,filter
sorted:对可迭代对象进行排序
max求最大值 max(可迭代对象
list1 = [1, 2, 3, 4, 5]
# max 内部会将list1中通过for取出每一个值,并且进行判断
print(max(list1))
5
获取dict1中薪资最大的人的名字
dict1 = {
'tank': 1000,
'egon': 500,
'sean': 200,
'jason': 500
}
print(max(dict1, key=lambda x: dict1[x]))
tank
获取dict1中薪资最小的人的名字
dict1 = {
'tank': 1000,
'egon': 500,
'sean': 200,
'jason': 500
}
print(min(dict1, key=lambda x: dict1[x]))
sean
sorted:默认升序(从小到大)reverse:反转 reverse 默认是False
list1 = [10, 2, 3, 4, 5]
print(sorted(list1))
[2, 3, 4, 5, 10]
reverse=True--> 降序
list1 = [10, 2, 3, 4, 5]
print(sorted(list1, reverse=True))
[10, 5, 4, 3, 2]
dict1 = {
'tank': 100,
'egon': 500,
'sean': 200,
'jason': 50
}
# new_list = ['egon', 'sean', 'tank', 'jason']
new_list = sorted(dict1, key=lambda x: dict1[x], reverse=True)
print(new_list)
['egon', 'sean', 'tank', 'jason']