提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、函数也是对象
Python 中,圆括号意味着调用函数。在没有圆括号的情况下,Python 会把函数当做普通对象。
二、全局变量和局部变量
- 全局变量:
在函数和类定义之外声明的变量。作用域为定义的模块,从定义位置开始直到模块
结束。
全局变量降低了函数的通用性和可读性。应尽量避免全局变量的使用。
全局变量一般做常量使用。
函数内要改变全局变量的值,使用global 声明一下 - 局部变量:
在函数体中(包含形式参数)声明的变量。
局部变量的引用比全局变量快,优先考虑使用。
如果局部变量和全局变量同名,则在函数内隐藏全局变量,只使用同名的局部变量
a = 100 #全局变量
def f1():
global a #如果要在函数内改变全局变量的值,增加global 关键字声明
print(a) #打印全局变量a 的值
a = 300
f1()
print(a)
执行结果:
100
300
三、参数
1.传递
Python 中参数的传递都是“引用传递”,不是“值传递”。分为两类:
- 对“可变对象”进行“写操作”,直接作用于原对象本身。
- 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填
充这块空间。
可变对象有:
字典、列表、集合、自定义的对象等
不可变对象有:
数字、字符串、元组、function 等
2.浅拷贝和深拷贝
copy.copy(浅拷贝)、copy.deepcopy(深拷贝)
3.传递不可变对象包含的子对象是可变的情况
传递不可变对象时,不可变对象里面包含的子对象是可变的,则方法内修改了这个可变对象,源对象也发生了变化。
a = (10,20,[5,6])
print("a:",id(a))
def test01(m):
print("m:",id(m))
m[2][0] = 888
print(m)
print("m:",id(m))
test01(a)
print(a)
运行结果:
a: 41611632
m: 41611632
(10, 20, [888, 6])
m: 41611632
(10, 20, [888, 6])
4.参数类型
- 位置参数:函数调用时,实参默认按位置顺序传递,需要个数和形参匹配。
- 默认值参数:默认值参数必须位于普通位置参数后面。
- 命名参数:也称“关键字参数”。
- 可变参数:*param(一个星号),将多个参数收集到一个“元组”对象中;**param(两个星号),将多个参数收集到一个“字典”对象中。
- 强制命名参数:在带星号的“可变参数”后面增加新的参数,必须在调用的时候“强制命名参数”。
四、特殊函数
1.lambda 表达式和匿名函数
lambda 表达式的基本语法:lambda arg1,arg2,arg3... : <表达式>
代码(示例):
g = [lambda a:a*2,lambda b:b*3,lambda c:c*4]
print(g[0](6),g[1](7),g[2](8))
执行结果:12 21 32
2.eval()函数
功能:将字符串str 当成有效的表达式来求值并返回计算结果。
语法:eval(source[, globals[, locals]]) -> value
参数:
source:一个Python 表达式或函数compile()返回的代码对象
globals:可选。必须是dictionary
locals:可选。任意映射对象
3.递归函数
每个递归函数必须包含两个部分:
- 终止条件
表示递归什么时候结束。一般用于返回值,不再调用自己。 - 递归步骤
把第n 步的值和第n-1 步相关联。
代码(示例):
#使用递归函数计算阶乘(factorial)
def factorial(n):
if n==1:return 1
return n*factorial(n-1)
for i in range(1,6):
print(i,'!=',factorial(i))
执行结果:
1 != 1
2 != 2
3 != 6
4 != 24
5!=120