雪花台湾

Python知识梳理(二)

Day6:控制流

(1) while循环 就是在某条件下循环执行某段程序多用于处理需要重复处理的相同任务
while 判断条件
执行语句

(2) while...else循环 和while循环的不同在于它会在循环正常执行完毕后执行 else 语句块中的代码

(3) for循环可以遍历任何序列的项目如一个列表或者一个字元串

(4) for...else循环和while...else循环一样会在循环正常执行完毕后执行 else 语句块中的代码

(5) while...else和for...else如果循环代码中有breakreturn或者错误产生的时候不会执行其else语句哦
循环控制流需要注意循环需要有结束循环的条件否则无限执行就会耗尽资源而导致代码崩溃中止

Day13:容器类型结构的封装和解构

Day15:解析式与生成器

(1) 列表解析式是将数据全部存储在内存中一并返回

(2) 列表解析是Python迭代机制的一种应用它常用于实现创建新的列表因此使用中括弧[]表示

(3) 使用列表解析式不会因为简写而影响效率反而优化提升效率减少代码量可读性强工作量降低
减少出错

集合解析式和列表解析式用法一样只是集合解析式使用大括弧{}表示

字典解析式使用大括弧{}表示并且要有两个表达式一个生成key一个生成value
两个表达式之间使用冒号分隔返回结果是字典

1.在Python中这种一边循环一边计算的机制称为生成器Generator

2.语法g = (item for item in range(10))和列表解析式很类似只是最外层为()不是[]

3.生成器的特点是按需计算惰性求值最大可能的节约内存空间比如1万条列表数据
我只需要读取里面的几条如果直接用for循环这些数据的话就会把这些数据一次性装进内存
导致占据大量资源这个时候使用生成器那么就可以做到我需要那几条就把那几条装进内存来求值

4.生成器是可迭代对象取值完毕之后无法再次取值它有两种取值方式一种是通过next获取值
这种方式取值时如果取值的次数超过生成器对象值的长度就会报错需要传入None参数

5.还有一种是通过for循环取值通过这种方式取值时如果取值的次数超过生成器对象值的长度for循环会通知
迭代所以不会报错我们一般使用for来进行循环获取

Day16:函数

1.函数代码块以 def 关键词开头后接函数标识符名称和圆括弧()

2.任何传入参数和自变数必须放在圆括弧中间圆括弧之间可以用于定义参数

3.函数的第一行语句可以选择性地使用文档字元串用于存放函数说明

4.函数内容以冒号起始并且缩进

5.return [表达式] 结束函数选择性地返回一个值给调用方不带表达式的return相当于返回 None

当一个函数中的某个参数的改动不大,就可以考虑将这个参数设置为默认参数

默认参数在一个函数中可以有多个,且默认参数必须放在位置参数后面

位置参数可以和关键字参数一起使用,但是位置参数必须在关键字参数之前,如:add(1, z=2, y=3)

1.可变参数就是表示传入的参数个数是可变的,可以一个也可以多个参数,它包括可变位置参数和可变关键字参数

2.可变位置参数(一个*+参数名)就是把参数封装成一个元组,然后在元组里面迭代

3.可变关键字参数(两个**+参数名)把参数构成一个key-value键值对组成的字典

前面有可变位置参数收集参数后面的所有参数必须使用关键字参数传值如下Python
应该这样调用add(1,2,3, k=6)不要这样调用add(1,2,3,6)
def add(*args, k):
print(*args, k)

参数封装就是在调用函数的时候把本应传入多个参数的数据封装成一个元祖或者字典更加简便

解构就是把封装成的元组或者是字典的数据解成单个的值符合函数参数的需求

*号是解构元组**号是解构字典

示例一如下函数add()需要传入xy参数按正常做法是add(1,2)这样但是我的数据是元祖也就是传入add((1,2))
但是这样的话就相当于只传入了x这个参数我们通过*(1,2)这样就可以把这个元祖解构为1,2这样的数据了
def add(x, y):
print(x, y)
add(*(1,2))

示例二字典的示例
def add(x=1, y=2):
print(x, y)
add(**{x:100, y:200})

Day17:函数的返回值与嵌套函数

当return语句执行完毕后面的语句将不会再执行

如果一个函数里面有两个return前面return执行完毕后面的return也不会执行
def add(x, y):
print(x, y)
return x + y
return x - y

将这些值通过逗号分开会把值进行压缩封装成一个元组return x,y,z得到结果是元祖(x,y,z)

而如果返回一个列表得到的就是一个列表

且内部函数只能在包含它的函数的直接父级调用,也就是只能在直接包含它的外部函数中调用

嵌套函数层数不宜过深,一般3层以内即可,太深不够直观,容易造成代码混乱

在函数外部定义的变数,即全局作用域,在函数体外部和内部都能被访问

在函数里面定义的变数,即局部作用域,只能在函数体内部被访问,函数外部不能访问

def outer():
def inner(a):
print(a)
return inner
func = outer()
func(1)
func得到的是inner这个函数引用需要调用

闭包的理解
就是在函数a里面再嵌套一个函数b等那么函数b里面都可以引用函数a的变数然后函数a返回值是函数b
这样就形成了闭包

如果要访问函数体内部的函数可以先把内部函数的函数名作为外部函数的返回值把外部函数的引用赋值给
变数再调用变数这就是闭包

同一个函数的生命周期相同函数的默认值会绑定在函数的整个生命周期上不会因为函数内部对默认值的操作
而发生改变

函数默认值如果进行修改后默认值会发生改变这个时候可以使用浅拷贝copy模块的copy()函数简写[:]来清空默认值
那每次调用函数默认值都为初始值
def add(lst = []):
lst = lst[:]
# lst = copy.copy(lst)
lst.append(hello)
print(lst)
add()
add()

也可以通过参数值判断来给默认值重新赋值那每次调用函数默认值都为初始值

def add():
print(add)
del add

Day18:递归函数与匿名函数

1.递归一定需要有结束条件
2.每次进入更深一层递归时,问题规模比上一次递归都应有所减少
3.通常前一次递归的输出就作为后一次递归的输入
4.递归效率不高,递归层次过多会导致栈溢出

因为匿名函数没有名字所以不必担心函数名冲突匿名函数可以实现自调用

在Python中通常借助lambda表达式构建匿名函数关键字lambda表示匿名函数冒号前面的变数名表示函数参数

fn = lambda x: x+1
调用fn(3)

Day19:生成器函数

def gen():
print(line 1)
yield line 1
print(line 2)
yield line 2
print(line 3)
yield line 3
g = gen()
print(g)
next(g)
next(g)

yield就相当于专门给生成器用的return,可以理解每次next()迭代读取一个yield之前的代码来执行
生成器可以通过生成器表达式和生成器函数获取到
我们可以通过yield关键字来定义一个生成器函数,这个生成器函数返回值就是一个生成器对象
生成器函数也是用于惰性计算,相当于把函数分为多次执行。

语法糖指那些没有给计算机语言添加新功能而只是对人类来说更加易于使用和理解的语法
语法糖给程序员提供了更实用的编码方式有益于更好的编码风格更易读
生成器的语法糖也就是生成器的一种语法作用是使代码更加简洁

Day20:高阶函数

1.sorted是Python提供的功能强大的排序函数满足字元数字等排序要求
2.函数的第一个参数为可迭代对象第二个参数key作为排序的规则指定按什么排序),
第三个参数表明是否反向
3.sorted函数的返回结果是列表类型

1.filter函数也是接收一个函数和一个序列的高阶函数其主要功能是过滤
2.第一个参数是一个函数第二个参数是可迭代对象
3.filter函数的返回值是迭代器对象filter

1.map函数用来将序列中的值处理再依次返回至列表内
2.第一个参数func为函数实现函数映射的功能第二个参数为可迭代对象
3.map函数的返回值为一个迭代器对象map

来自:https://www.9xkd.com/user/plan.html


推荐阅读:
相关文章