接上一篇函数
函数的名称空间
在python解释器开始执行之后, 就会在内存中开辟一个空间, 每当遇到一个变量的时候, 就把变量名和值之间的关系记录下来, 但是当遇到函数定义的时候, 解释器只是把函数名读入内存, 表示这个函数存在了, 至于函数内部的变量和逻辑, 解释器是不关心的. 也就是说一开始的时候函数只是加载进来, 仅此而已, 只有当函数被调用和访问的时候, 解释器才会根据函数内部声明的变量来进行开辟变量的内部空间. 随着函数执行完毕, 这些函数内部变量占用的空间也会随着函数执行完毕而被清空.
def fun():
a = 10
print(a)
fun()
print(a) # a不存在了已经..
命名空间分类: 1. 全局命名空间—> 我们直接在py文件中, 函数外声明的变量都属于全局命名空间 2. 局部命名空间—>
在函数中声明的变量会放在局部命名空间 3. 内置命名空间—> 存放python解释器为我们提供的名字, list, tuple,
str, int这些都是内置命名空间加载顺序:
1.内置命名空间
2.全局命名空间
3. 局部命名空间(函数被执行的时候)
取值顺序:
- 局部命名空间
- 全局命名空间
- 内置命名空间
函数的嵌套
- 只要遇见了()就是函数的调用. 如果没有()就不是函数的调用
- 函数的执行顺序
def fun1(): #第一步
print(111) #第六步
def fun2(): #第二步
print(222) #第四步
fun1() #第五步
fun2() #第三步
print(111) #第七步
gloabal、nonlocal
a = 100
def func():
global a # 加了个global表示不再局部创建这个变量了. 而是直接使用全局的a
a = 28
print(a)
func()
print(a)
global表示. 不再使用局部作用域中的内容了. 而改用全局作用域中的变量
- global 宗旨:在函数内部修改全局的变量,如果全局中不存在就创建一个变量
- nonlocal宗旨:nonlocal 只修改上一层变量,如果上一层中没有变量就往上找一层,只会找到函数的最外层,不会找到全局进行修改
a = 10
def func1():
a = 20
def func2():
nonlocal a
a = 30
print(a)
func2()
print(a)
func1()
结果:
加了nonlocal
30
30
不加nonlocal
30
20
内置函数
- 什么是内置函数? 就是python给你提供的. 拿来直接用的函数, 比如print., input等等.截止到python版本3.6.2 python一共提供了68个内置函数. 有 一些我们已经用过了. 有一些还没有用过. 还有一些需要学完了面向对象才能继续学习的.今天我们就认识一下python的内置函数.
为了方便大家记忆,我将这些内置函数进行分类。 - 作用域相关:
locals():
返回当前作⽤用域中的名字
globals():
返回全局作⽤用域中的名字 - 迭代器相关:
range()
next():
迭代器向下执⾏一次, 内部实际使用了next()方法返回迭代器的下一个项目
iter():
获取迭代器, 内部实际使用的是iter()方法来获取迭代器 - 字符串类型代码的执行:
eval():
执行部分字符串类型的代码,并返回最终结果
exec():
执行字符串类型的代码 - 输入和输出相关:
input():
获取用户输入的内容
print():
打印输出 - 内存相关:
hash():
获取到对象的哈希值(int, str, bool, tuple)
id():
获取到对象的内存地址 - 文件操作
open():
用于打开一个文件, 创建一个文件句柄 - 帮助
help():
函数用于查看函数或模块用途的详细说明 - 调用相关:
callable():
用于检查一个对象是否是可调用的. 如果返回True, object有可能调用失败, 但如果返回False. 那调用绝对不会成功 - 查看内置属性:
dir():
查看对象的内置属性
基础数据类型相关 - 数字相关:
bool() 将给定的数据转换成bool值. 如果不给值. 返回False
int() 将给定的数据转换成int值. 如果不给值, 返回0
float() 将给定的数据转换成float值. 也就是小数
complex() 创建一个复数. 第一个参数为实部, 第二个参数为虚部. 或者第一个参数直接 用字符串来描述复数 - 数学运算:
abs() 返回绝对值
divmod() 返回商和余数
round() 四舍五入
pow(a, b) 求a的b次幂, 如果有三个参数. 则求完次幂后对第三个数取余
sum() 求和
min() 求最小值
max() 求最大值
数据结构相关
- 列表和元组:
list() 将一个可迭代对象转换成列表
tuple() 将一个可迭代对象转换成元组
reversed() 将一个序列翻转, 返回翻转序列的迭代器 - 字符串相关:
str() 将数据转化成字符串
format() 与具体数据相关, 用于计算各种小数, 精算等
bytes() 把字符串转换成bytes类型
repr() 返回一个对象的官方表示形式
数据集合
dict() 创建一个字典
set() 创建一个集合
frozenset() 创建一个冻结的集合,冻结的集合不能进行添加和删除操作
其他相关
len() 返回一个对象的元素个数
enumerate() 获取枚举对象
lambda 函数
- 匿名函数,为了解决一些简单的需求而设计的一句话函数
def func(n):
return n**n
print(func(4))
f = lambda x: x**x
print(f(4))
结果:
256
256
lambda表示的是匿名函数,不需要用def来声明,一句话就可以声明出一个函数
语法:
函数名 = lambda 参数:返回值
注意:
1.函数的参数可以有多个,多个参数之间用逗号隔开
2.匿名函数不管多复杂.只能写一行.且逻辑结束后直接返回数据
3.返回值和正常的函数一样,可以是任意数据类型,返回值的时候只能返回一个不能返回多个匿名函数并不是说一定没有名字,这里前面的变量就是一个函数名,说他是匿名原因是我们通过name查看的时候是没有名字的.统一都叫做lambda.在调用的时候没有什么特别之处像正常的函数调用既可
高级函数
- filter/map/reduce
1.filter:筛选过滤
语法: filter(function,iterable)
function: 用来筛选的函数,在filter中会自动的把iterable中的元素传递给function,然后根据function返回的True或者False来判断是否保留此项数据
iterable:可迭代对象
lst = [{'id':1,'name':'alex','age':18},
{'id':1,'name':'wusir','age':17},
{'id':1,'name':'taibai','age':16},]
ls = filter(lambda e:e['age'] > 16,lst)
print(list(ls))
结果:
[{'id': 1, 'name': 'alex', 'age': 18},
{'id': 1, 'name': 'wusir', 'age': 17}]
2.map: 映射函数
语法: map(function,iterable) 可以对可迭代对象中的每一个元素进映射,分别取执行function
计算列表中每个元素的平方,返回新列表
lst = [1,2,3,4,5]
def func(s):
return s*s
mp = map(func,lst)
print(mp)
print(list(mp))
3.reduce:
from functools import reduce
def func(x,y):
return x + y
# reduce 的使用方式:
# reduce(函数名,可迭代对象) # 这两个参数必须都要有,缺一个不行
ret = reduce(func,[3,4,5,6,7])
print(ret) # 结果 25
reduce的作用是先把列表中的前俩个元素取出计算出一个值然后临时保存着,
接下来用这个临时保存的值和列表中第三个元素进行计算,求出一个新的值将最开始
临时保存的值覆盖掉,然后在用这个新的临时值和列表中第四个元素计算.依次类推
注意:我们放进去的可迭代对象没有更改
以上这个例子我们使用sum就可以完全的实现了.我现在有[1,2,3,4]想让列表中的数变成1234,就要用到reduce了.
普通函数版
from functools import reduce
def func(x,y):
return x * 10 + y
# 第一次的时候 x是1 y是2 x乘以10就是10,然后加上y也就是2最终结果是12然后临时存储起来了
# 第二次的时候x是临时存储的值12 x乘以10就是 120 然后加上y也就是3最终结果是123临时存储起来了
# 第三次的时候x是临时存储的值123 x乘以10就是 1230 然后加上y也就是4最终结果是1234然后返回了
l = reduce(func,[1,2,3,4])
print(l)
匿名函数版
l = reduce(lambda x,y:x*10+y,[1,2,3,4])
print(l)
以上就是函数的内容,感谢点击观看,欢迎评论