python基础5-变量/递归函数/函数式编程/内置函数
-
全局变量与局部变量
- 顶头定义,或者叫没有缩进的定义变量,就叫全局变量
- 在子程序中要对全局变量做操作,则申明global 变量名
- 如果函数的内容无global关键字,优先读取局部变量,没有的话再读取全局变量,无法对全局变量重新赋值,但是对于可变类型,可以对内部元素进行操作,例如append,clear
- 全局变量全部大写,局部变量全部小写,代码规范
- 函数可以嵌套函数,在嵌套函数中,用nonlocal name可以申明位name为外层函数的同名变量,而不是全部变量
-
前向应用
- 风湿理论,函数即变量,在函数语句运行之前,函数已经被申明即可执行。这点跟变量一样
- 函数定义时不会执行,在内存中开辟地址,变量名为门牌号,函数内容被当作字符串存入门牌中
-
递归
- 编程方法论:函数式编程中没有循环,都是递归
- 递归特性:必须有一个明确的结束条件,否则是死循环,直接报错。在函数内满足条件时,执行return语句
- 列表可以用person_list.pop(0),弹出列表的第一个元素
- 加上断点分析,debug
-
作用域
- 函数名相当于函数的内存地址,加上()才是函数
- return 函数名,即返回一个函数地址,函数地址()即可执行函数。return 可以接任意参数
- 想拿到函数执行的地址,就让a= f()
- 函数的作用域在申明时已经决定,跟调用位置无关
-
匿名函数
- 用lambda x:x+1,第一个x是形参,x+1是函数的返回值
- func = lambda x:x+1,然后func(9)即可执行
- lambda应该跟其他函数一块用,而不是func = lambda的形式,如map函数
- 其中x+1的位置,一般是简单逻辑,而不是for循环,if判断等
- 返回多个值时,需要自己加括号,lambda x,y,z: (x+1,y+1,z+1)
-
函数式编程
- 语言是用来跟计算机沟通的
- 编程方法论,面对过程,函数式编程,面向对象
- 面向过程,把大问题分成小问题,找到解决问题的入口,按照一个固定的流程去模拟解决问题的流程
- 函数式编程= 编程语句定义的函数+数学意义的函数。定义好数学模型y=2*x+1,用python函数实现上述数学模型。hasell clean erlang是严格意义上的函数式编程语言
- 面向过程,def cal(x):res = 2*x res+=1 return res
- 函数式编程的特性:不定义变量,不修改变量,直接往下操作。
- 函数即变量,函数名可作为参数传递,返回值可以是函数名,叫高阶函数,装饰器会用到
- return test1(),即先执行tets1(),返回函数test1的执行结果
- 调用栈,多层嵌套函数的情况下,上层没执行完就要进入下一层时,要保留上一层运行情况,等下一层执行完,再回来执行上一层,称为调用栈
- 尾调用优化:在函数的最后1步调用另外一个函数,这样上一层函数就不用保留了,相当于直接转入下一个函数。最后1行不一定是最后1步,例如if else判断
- map函数。map(lambda x:x+1,num_1),第一个位置传函数名,不带()。第二个位置传实参。map执行逻辑,遍历第二个实参,每个都交给第一个位置函数处理一遍。map返回结果是个迭代器,需要外套list可转换为列表
- filter函数。filter(lambda n:not n.endwith('sb'),movie_people),第一个参数是函数,第二个参数是可迭代对象,把第二个可迭代对象可循环遍历,拿出每个元素交给前边函数筛选一遍,得到布尔值,为true则保留
- reduce函数。from funtools import reduce,先导入。把一个序列进行合并操作。reduce(lambda x,y:x+y, num_1 ,1),1为初始值,把列表num_1中的值遍历,交给lambda函数累加一遍
-
python内置函数
- all([1,2,'1',''])判断每个元素的布尔值,全部为真,则all返回true
- any跟all相反,只要有一个为真,就为真
- bin()转换为十进制二进制,hex是十进制转16进制,oct是转换8进制
- 编程时就是写了字符串,要想保存到硬盘上就要编码。存到内存中用unicode,硬盘上自己选择编码。
- name = ‘你好’,bytes(name,encoding='utf-8').decode(utf-8),将字符串按照utf-8编码,1个汉字占用3个字节,然后解码。ASCII码不能编中文
- divmod(10,3)结果(3,1),分页功能。用在搜索结果分页上,10个搜索结果,每页3条,则需要3+1页面显示结果
- eval()功能,1,把字符串的数据结构提取出来,例如从字符串包含字典中,提取出字典来。2,可以把字符串中的数学运算做一遍
- hash运算,1不论输入多长,输出定长,2不能根据输出反推出输入。同样输入,输出一一定,可校验软件安装包是否安全
- help(dir)获取函数的帮助文档。dir获取函数有哪些模块。
- isinstance(1,int),判断1是否为int类型
- print(globals()),打印出全局变量,locals打印出局部变量
- print(_file_)打印出文件路径
- zip(('a','b','c'),(1,2,3)),拉链函数,生成三个元组('a',1),左边一个对应右边一个。zip前后两个参数,只要是序列类型即可,元组,列表,字符串都是序列类型
-
max函数和min是一对。第一步:处理的是可迭代对象,相当于一个for循环取出每个元素进行比较。第二步,元素之间比较大小是从每个元素的第一个位置依次比较
- 比较字典的value值大小时,先用zip函数生成新的元组序列,然后max即可。不同数据类型不能比较。
- max(people, key=lambda dic:dic['age'],将字典people中元素遍历取出,每个调用一遍lambda函数,然后比较大小
- chr(97)和ord('a')是一对
- pow(3,3,2),3的3次方,对2取余数。如果只有两个,叫3的3次方
- round(3.5)。四舍五入
- slice(1,4,2),对字符串切片,左闭右开,步长为2
- type()查看元素的数据类型
- vars(),如果没有实参,则等效于locals,即局部变量。如果有实参int,则将实参int的所有方法存储为字典形式
- import,模块就是py文件。import不能导入字符串,_import_()导入的就是字符串类型文件