python函数
一、函数的初识
特点:
- 关键字 def,固定不可变
- def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。
- 函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并且要具有可描述性
优点:
- 可读性高
- 降低代码重复性
函数的结构:
#基础
def 函数名():
函数体
#调用
函数名()
---------------------------------
#有参函数
def 函数名(参数1,参数2):
函数体
#调用
函数名(传参1,传参2)
---------------------------------
#有返回值的函数,return后面的代码不会执行
def 函数名():
函数体
return
例子:
def meet():
print('打开')
print('爱你')
print('不爱你')
print('关闭')
meet()
#return 也可以输出出来
def meet():
print('打开')
print('爱你')
print('不爱你')
print('关闭')
return 'aaa'
ret = meet()
print(ret)
二、函数参数具体介绍
2.1、形参、实参
def sum(a): #形参:形式上的参数---函数定义时的命名的参数
print(a)
sum(1) #实参:实际上的参数---函数调用时传入的参数
2.2、实参之位置参数
- 从左至右一一对应,也就是定义了几个形参就得传递几个实参
def max(a,b):
if a > b:
print(a)
else:
print(b)
max(1,2)
#三元运算符:c 等于a,如果a大于b,c就等于a,否在c等于b
c = a if a > b else b
2.3、实参之关键字参数
- 调用的时候,把实参一 一复制给形参(可不对应)
def max(a,b):
print(a>b)
max(b=1,a=2)
2.4、实参之混合参数
- 调用的时候,把上面2种混合用
- 注意:位置参数一定得在关键字参数前面!!!
def max(a,b,c,d):
print(a>b)
max(a=1,b=2,4,5)
2.5、形参的传参之普通传参
def max(a,b,c,d):
print(a>b)
max(a=1,b=2,4,5)
2.6、形参的传参之可变长度参数(万能参数)
- 一个*
- 以*开头代表着一个任意长度的元组,可将一连串参数都放到一个元组中
- *有拆开元组、列表的作用
def self_print(name,*a):
print(a)
print(type(a))
self_print(1,2,3,4,5)
此时name=1,*a=2,3,4,5
#拆开元组、列表
t=(1,2,3,4,5)
print(*t)
def f(*tt):
print(tt)
f(*[1,2,3,4,5])
>>>
1 2 3 4 5
(1, 2, 3, 4, 5)
- 二个*
- 以**开头代表着一个字典,参数的形式是“key=value”,可以接受连续任意多个参数
- **有拆字典的作用
def d_self_print(**kwargs):
print(kwargs)
print(type(kwargs))
d_self_print(last_name="dsf",first_name="Af")
{'last_name': 'dsf', 'first_name': 'Af'}
<class 'dict'>
#补充
def func(*args,**kwargs):
print(args) #打印出来的是元组
print(kwargs) #打印出的的是字典
func()
#拆字典
def ff(**kwargs):
print(kwargs)
ff(**{'name':'zhangsan','age':20})
>>>
{'name': 'zhangsan', 'age': 20}
2.7、形参的传参之默认参数
- 定义函数时为参数提供默认值,调用函数时可传也可不传该默认参数的值
- 所有必须参数必须出现在默认参数前,包括函数定义和调用
- 当缺省参数没有传入,默认值会生效
如果想同时使用:参数的最终位置:(a,b,*args,sex='男',**kwarg
(* **做为形参的时候是聚合,作为实参是打散)
def f(name, age, sex = 'male' ):
print('I am %s , I am %d years old'%(name, age))
print('Sex : %s'%sex)
#不传参,用默认的
f(name='李四', age=19)
#传参,用传入的
f('张三', 88, sex='female')
三、命名空间(名称空间)
3.1、命名空间分类
1. 全局命名空间--> 我们直接在py文件中, 函数外声明的变量都属于全局命名空间
2. 局部命名空间--> 在函数中声明的变量会放在局部命名空间
3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
3.2、执行顺序
内置名称空间 ----> 全局名称空间 ----> 局部名称空间
3.3、取值顺序
就近原则:先从局部名称空间---->到全局名称空间---->内置名称空间
单向不可逆:外面的取不了函数里面的
3.4、作用域
1、全局作用域:包括内置名称空间、全局名称空间
2、局部作用域:局部名称空间(函数里面的呗)
面试题:问为什么抱错啊?
count = 1
def fun():
count += 1
print(count)
fun()
#解决方法
global count
count = 2
def fun():
global count
count += 2
print(count)
fun()
答案:1、局部作用域不能改变全局作用域(只能引用不能改变)
2、当python解释器读取到局部作用域时,发现你对一个变量进行修改的操作,解释器会认为你 在局部已经定义了这个局部变量,他就会从局部找这个局部变量,找不到报错了!
四、高阶函数(函数的嵌套)
五、内置函数
内置函数介绍:就是python封装好的函数、用的时候直接调用就可以了
一带而过:all() any() bytes() callable() chr() complex() divmod() eval() exec() format() frozenset() globals() hash() help() id() input() int() iter() locals() next() oct() ord() pow() repr() round()
重点1:abs() enumerate() filter() map() max() min() open() range() print() len() list() dict() str() float() reversed() set() sorted() sum() tuple() type() zip() dir()
重点2: classmethod() delattr() getattr() hasattr() issubclass() isinstance() object() property() setattr() staticmethod() super()
六、关键字:global
global:
global第一个功能:在局部作用域中可以更改全局作用域的变量。
count = 1
def search():
global count
count = 2
search()
print(count)
利用global在局部作用域也可以声明一个全局变量。
def func():
global a
a = 3
func()
print(a)
所以global关键字有两个作用:
1,声明一个全局变量。
2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。
七、关键字nonlocal
nonlocal是python3x新加的功能,与global用法差不多,就是在局部作用域如果想对父级作用域的变量进行改变时,需要用到nonlocal,当然这个用的不是很多,了解即可。
def add_b():
b = 42
def do_global():
b = 10
print(b)
def dd_nonlocal():
nonlocal b
b = b + 20
print(b)
dd_nonlocal()
print(b)
do_global()
print(b)
add_b()
nonlocal关键字举例
nonlocal的总结:
1,不能更改全局变量。
2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。