Python基础_Day08

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")

猜你喜欢

转载自blog.csdn.net/weixin_42076261/article/details/88379773