1.三元运算(简单,有结果,必须有if else)
a = 1 b = 2 c = a if a > b else b
print(c)
==左右判断是否相等和一致,is判断内存地址id()
2.函数
1.函数变量:
(1)动态变量 :*args 接收位置参数,组织成tuple
**kwargs接收关键字参数,组成一个dict
PS:参数顺序:位置参数,*args,默认参数,**kwargs
lis1 = [1,2,3,4,5,6,7]
func(*lis1) #站在实参的角度上,给一个序列加上*,就是将这个序列按照顺序打散
2.闭包(嵌套函数,内部函数调用外部函数)基本格式:
def func1(): a = 1 def func2(): print('a') return func2 func = func1() func()
优点:避免多次调用函数,局部变量a不断生成消失
名称空间:当程序执行时,将变量于值的的关系放在一个空间
临时名称空间:函数中的变量以及值的对应关系放在一个空间中,这个空间会随着函数结束而消失
内置名称空间:python自带的:包括内置函数等
全局作用域:内置名称空间和全局名称空间
局部作用域:临时名称空间
global:在函数中声明一个全局变量,在函数中修改一个全局变量
nonlocal:在函数中对父级或者更高级的变量进行修改,但是不能修改全局变量
函数名的运用:可以作为变量。可以作为容器类的元素,可以作为函数的参数,可以作为函数的返回值
3.一个修改文件的函数示例
def func1(f, old, new): with open(f, encoding='utf-8') as f1, open('%s.bak'%f, w,encoding='utf-8') as f2: for line in f1: if old in line: line = line.replace(old, new) f2.write(line) import os os.remove(f1) os.rename('%s.bak'%f, f)
4. 装饰器
#不想修改函数的调用方式,但是还是想在函数前后添加功能,本质是闭包函数
#原则:开放封闭原则
开放:对拓展是开放的
封闭:对修改是封闭的
#语法糖: @装饰器函数名
被装饰函数体
被装饰函数调用
(1)一个装饰器wrapper的标准格式
from functools import wraps def wrapper(f): @wraps(f) def inner(*args,**kwargs): print(在被装饰函数之前做的事) ret = f(*args,**kwargs) print(在被装饰函数之后做的事) return ret return inner @wrapper #f = wrapper(f) def f(*args, **kwargs): print(*args, **kwargs)
(2)装饰器的进阶
func.__name__ #返回函数名的str格式
#带参数的装饰器
#多个装饰器装饰一个函数
5.迭代器(iterator)
#可迭代(iterable):数据类型拥有__iter__()方法就可迭代(可迭代协议); __iter__()方法独有三种方法__setstate__(), __next__(), __length_hint__();
#迭代器协议---内部含有__iter__(), __next__()就是迭代器
#[]是可迭代的 [].__iter__()是迭代器
#for循环其实就是在使用迭代器
#迭代器的特点: #节省内存,惰性机制,一条路走到黑
#简单模拟for
1 lis = [1,2,1245,1243,346,34623,2352] 2 iterator = lis.__iter__() 3 try: 4 while 1: 5 print(iterator.__next__()) 6 except StopIteration: 7 print('done')
6.生成器----本质是迭代器
#生成器函数----含有yield关键字,必须写在函数里,不能和return共用
#从生成器中取值:__next__ for loop 数据类型强制转换 send(None)
#列表推导式和生成器表达式
[i for i in range(30) if i %3 ==0] 返回一个列表
[i for name in names for i in name if name.count('e') == 2]
(i for in range(10)) 返回一个生成器
#字典推导式
例:将dict key和value对调
mcase = {'a': 10, 'b': 34}
m_re = {mcase[k]: k for k in mcase}
#集合推导式
{x **2 for i in [1, -1, 2]} 自带去重
7.内置函数
https://www.processon.com/mindmap/5c87ba86e4b02b2ce495b486
8.匿名函数
函数名 = lambda 参数 : 返回值
max min sorted filter map(会根据提供的函数对指定序列做映射)
1 >>> def square(x) : # 计算平方数 2 return x ** 2 3 4 >>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方 5 [1, 4, 9, 16, 25] 6 >>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数 7 [1, 4, 9, 16, 25] 8 9 # 提供了两个列表,对相同位置的列表数据进行相加 10 >>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]) 11 [3, 7, 11, 15, 19]
9.递归:自己调用自己,最大的作用就是遍历树形结构
递归深度最大997次,998次报错
10.二分查找