1.听写
1.列表
list0 = [22, 51, 38, 79, 67, 42] # 利用二分法查找42
list0.sort() # 小--->大
min_index = 0
max_index = len(list0) - 1
mid_index = (min_index + max_index) // 2
while list0[mid_index] != 42:
if 42 > list0[mid_index]:
min_index = mid_index + 1
elif 42 < list0[mid_index]:
max_index = mid_index - 1
if max_index >= min_index: # 要先判定区间是否合理
mid_index = (min_index + max_index) // 2
else:
print("找不到") # 找不到了
break
else:
print("找到了在 %d索引处" % mid_index)
2.字典
dict0 = {"英语":66, "数学":78, "政治":42, "语文":59} # 去除掉字典中value < 60的数据
# 在遍历字典的期间 不允许修改字典的长度 如果自身没有办法发生修改 借助其他数据来辅助完成功能的实现
new_dict = {}
for k, v in dict0.items():
if v >= 60:
new_dict[k] = v
print(new_dict)
2.课程概述
1.列表生成式 - 字典生成式
2.生成器(generator)
3.迭代器 —>遍历序列的另外一种方式
4.函数补充
可变参数
关键字参数 --->调用函数传递数据是传递的格式是 : 字段名=数值, 字段名=数值
匿名函数 --->快捷生成一个简易函数的方式
偏函数--->系统的方法也有默认参数 --->print(end="\n")
某种场景下 不是使用换行比较多 而是……省略号比较多
3.列表/字典生成式
快速的生成有个列表或者字典的一种方式
列表生成的格式:
[存放于列表中的元素 元素的来源 元素筛选判定]
案例:
# 在列表中存放1-10的数据
list0 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list0 = list(range(1, 11))
# 存放奇数
list0 = []
for i in range(1, 11):
if i % 2 != 0:
list0.append(i)
# 用列表生成式来写
list0 = [i for i in range(1, 11) if i % 2 != 0]
list0 = [" ", "\nabc", "\t", "hello"]
'''
在list0的基础上快速的生成一个列表 列表的存放的元素是非空白序列
如何判断一个序列是空白字符序列--->按照空白进行切割 列表的长度为0
去除字符序列两端空白 strip() --->按照空白区去除两端的内容 如果最终剩下的是空序列
如果使用的是空白分割符的话 会将生成的列表中中的空字符序列给移除掉
'''
res = [item for item in list0 if len(item.split()) != 0]
print(res)
字典生成式
{存放于字典中的键值对例如k:v 键值对的来源 键值对的筛选}
dict0 = {"英语":66, "数学":78, "政治":42, "语文":59} #去除掉字典中value < 60的数据
dict1 = {k:v for k,v in dict0.items() if v >= 60}
print(dict1)
将二维列表中的数据 以键值对形式存于字典中 [[12, 34],[34, 56]]
for k,v in list0:
dict2[k] = v
print(dict2)
dict3 = {k:v for k,v in list0}
print(dict3)
dict0 = {"A":"a", "B": "b "}
利用字典生成式 将k v颠倒
dicr3={k:v for v,k in dict0.items()}
4.生成器(generator)
生成的是一个存放数据的容器
与列表生成式来进行对比的:
列表生成式可以快速的生成一批数据 如果这些数据在使用的时候只使用前几个 造成内存浪费的现象生成器是来弥补这个缺陷的 可以生成一批数据 但是这些数据不会立即存放于内存中 而是当你提取的时候才会存放于内存中
声明生成器的方式:
1.将列表生成式的语法中 把中括号设置为小括号
(生成器中元素 元素来源 元素的筛选)
2.类似于方法的声明 只不过将return 替换yield
def gene():
数据
yield 数据
# 列表生成式
list0 = [i for i in range(1, 10001)]
print(list0) # 会在内存中立即存放这些数据
# 声明生成器
gene = (i for i in range(1, 10001))
print(gene) # <generator object <genexpr> at 0x000001733BF7FE60>
# 原理
def test():
for i in range(1, 10001):
yield i
print(i,"yield之后执行的语句") # 当下一次获取时候回执行
ge = test()
print(ge)
value = next(ge)
print(value)
value1 = next(ge)
print(value1)
'''
<generator object test at 0x000001733BF7FF10>
1
1 yield之后执行的语句
2
'''
# 前10个
list0 = []
for i in range(10):
value = next(ge)
list0.append(value)
value = next(ge)
print(value)
print(list0)
'''
1 yield之后执行的语句
2 yield之后执行的语句
3 yield之后执行的语句
4 yield之后执行的语句
5 yield之后执行的语句
6 yield之后执行的语句
7 yield之后执行的语句
8 yield之后执行的语句
9 yield之后执行的语句
10 yield之后执行的语句
11
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
'''
gene = (i for i in range(1, 10))
for i in range(10):
value = next(gene)
print(value)
# StopIteration 什么时候报这个错误 当生成器中数据已经取完了 再获取的话就会报错
如何在生成器中获取数据
通过next方法 进行数据获取
内部执行类似于 for-in 指针移动获取数据
5.迭代器
遍历序列:
for 变量 in 序列:
迭代器是另外一种遍历序列的方式 是通过next方法 指针向下移动获取数据的
想使用迭代器进行遍历序列 前提 序列必须是可迭代的
如何验证一个序列是否可以迭代?
iterator 类型 --->只要从属于这个类型 那么就代表该数据可以使用迭代器进行遍历
这个类型为模块collections
# 可以使用迭代器进行遍历
from collections import Iterator
# 符合这个类型的都可以通过for-in进行遍历
res = isinstance(11, Iterable)
print(res) # False
res = isinstance("11", Iterable)
print(res) # True
res = isinstance([], Iterable)
print(res) # True
res = isinstance((), Iterable)
print(res) # True
res = isinstance({}, Iterable)
print(res) # True
res = isinstance(set(), Iterable)
print(res) # True
'''
能够使用for-in遍历的数据一定可以使用迭代器来进行遍历码?
不一定
迭代器的遍历是通过next方法进行遍历的 能使用迭代器来进行遍历 前提必须是属于Itarator这种类型
'''
a = "11"
next(a)
print(res) # 'str' object is not an iterator
'''
如何将可以使用for-in 进行遍历的数据 也可以使用迭代器进行遍历
可以将数据通过iter()的方法将其转化为Iterator的类型
'''
ite = iter(["12", "17", "34", "99"])
value = next(ite)
print(value) # 12
6.函数补充
6.1可变参数
原来:
def 函数名(形参变量1, 形参变量2...):
pass
函数名(实参数据, 实参数据)
设置一个功能: 求n个数的累加和
像这种形参个数不明确的情况下 可以把形参设置为可变参数
格式:
def 函数名(*变量名):
方法体
return 结果
讲解:
可变的形参变量在函数体中被当做元组存在
# 声明一个功能 实现n个数的累加和
def add(*nums):
print(nums)
print(type(nums))
# 声明一个变量 记录最终的和
total = 0
for item in nums:
total += item
return total
# 调用函数 可以传递多个实参数据 每个数据之间使用逗号隔开即可
res = add(12, 34, 5, 67, 87)
print(res) #(12, 34, 5, 67, 87)
#<class 'tuple'>--->元组
#205
res = add(*(12, 34, 56, 78))
print(res) #(12, 34, 56, 78)
#<class 'tuple'>--->元组
#180
res = add(*[12, 76, 85, 41]) # 列表
print(res) #(12, 76, 85, 41)
#<class 'tuple'>--->元组
#214
6.2 关键字参数
关键字参数就是调用函数的时候允许调用者传入0个或者多个带有[形参名]的字段数据
方法声明格式:
def 函数名(形参名, 形参名1, **变量名):
方法体
return 结果
讲解:
**变量名在函数体中被当做字典存在 结束的是调用者传递过来的 变量名=数值这种数据
函数名(12, 34, value1=18, value2=77)
def accept_data(name, email, **kwargs):
print(name,email,kwargs)
if "city" in kwargs:
print(kwargs["city"])
accept_data("小沐", "[email protected]", city="北京", sex="女")
注册信息的时候 有必填项 和 选填项
当声明函数时 不知道调用者具体传递的字段和其对应的数据 这个时候就把这个变量声明成关键字参数
6.3匿名函数
快捷生成简易函数的一种方式
def add(num1, num2):
return num1 + num2
可以使用匿名函数完成 匿名函数的格式:
f = lambda 形参1,形参2,..形参n: 执行语句 [一般写的时候执行语句只有一条]
# 如果语句中与return return要省略
f = lambda num1, num2: num1 + num2
print(f) # <function <lambda> at 0x0000025E99AE8AE8>
res = f(12, 34)
print(res) # 46
list0 = ["Abce", "Ok", "better", "Name", "Pig"]
# 按照元素首字母大写来进行升序排序
def get_item(item):
return item.capitalize() # Better
list0.sort(key=get_item)
print(list0)
# 使用匿名函数
list0.sort(key=lambda item: item.capitalize())
print(list0)
6.4偏函数
在某些特定的场景下 一些功能的默认需求不能满足场景 为了便于功能的使用
在原功能基础上 修改一下默认参数值 生成新的函数 使用的使用调用新函数
# 设置自定义函数 重新修改一下原功能的默认
def cus_print(*values):
print(*values, end="...")
# 系统提供了一种生成偏函数的方式
import functools
func = functools.partial(print, end="...")
func("ok")