目录
- 1 模块函数
- 1.1 模块函数
- 1.2 导入
- 1.2.1 import moudle
- 1.2.2 import module as alias
- 1.2.3 from module import function
- 1.2.4 from module import function as alias
- 2 自定义函数
- 2.1 定义函数
- 2.2 设置docstring
- 2.3 函数调用
- 2.4 返回值
- 2.5 形参
- 2.5.1 形参分类
- 2.5.2 * 与 **
- 2.5.3 命名关键字参数
- 2.6 实参
- 2.6.1 位置参数
- 2.6.2 关键字参数
- 2.7 变量可见性
- 2.7.1 局部变量
- 2.7.2 全局变量
- 2.7.3 非局部变量
- 2.8 参数传递规则
- 2.8.1 值传递
- 2.8.2 地址传递
- 2.9 lambda函数
- 2.9.1 定义
- 2.9.2 调用
1 模块函数
1.1 模块函数
模块函数指的是模块中的函数,模块函数有三种:
- 内置模块:又叫标准库.
- 第三方开源模块:可以通过包管理工具进行安装.
- 自定义模块.
1.2 导入
导入方法主要有三种:
1.2.1 import moudle
import math
math.e
1.2.2 import module as alias
1.2.3 from module import function
1.2.4 from module import function as alias
2 自定义函数
2.1 定义函数
使用关键字def定义:
def func():
print(1)
2.2 设置docstring
docstring就是注释,描述了函数的功能,使用三个单引号或三个双引号,可以用help()获取函数的docstring.
def func():
'''
func docstring
'''
print(1)
help(func)
2.3 函数调用
直接使用函数名即可,需要的话要加上参数.
func()
func(22)
2.4 返回值
返回值在return里指定,可以返回多个值:
def f():
return 1,2,3,4
相当于返回一个元组.若函数没有return,则返回None.
2.5 形参
2.5.1 形参分类
形参就是函数定义时的参数列表里面的参数,可以分为:
- 可选形参:给出默认值的形参.
- 必选形参:没有给出默认的形参.
def f(x1,x2,x3=3)
其中x1,x2必选形参,x3可选形参.
2.5.2 * 与 **
带一个 * 的形参表示该形参类型为元组,带两个 * 的形参表示该参数类型为字典.
2.5.3 命名关键字参数
出现在*后的参数.
def f(x1,*x2,x3,x4)
x3与x4就是命名关键字参数,在调用时必须显式使用参数名.
2.6 实参
python实参可以分为位置实参与关键字实参.
2.6.1 位置参数
位置参数就是没有指定形参名字的实参,每个实参基于顺序关联到一个形参.
2.6.2 关键字参数
关键字参数就是指定了形参名字的实参,用键值对的形式指定,可以不按顺序调用.
def f(x1,x2,x3):
print(x1,x2,x3)
f(1,2,3)
f(x3=999,x1=888,x2=999999)
2.7 变量可见性
python变量的可见性有三种:全局变量,局部变量,非局部变量.
2.7.1 局部变量
在函数内的变量为局部变量,因此,以下代码会输出9:
x1 = 8
def f():
x1 = 9
print(x1)
f()
如果在x1之前输出呢?
直接提示没有定义x1,就是全局变量x1在函数内不可见,但笔者不死心,一定要运行一下.
它说局部变量x1没有被赋值,注意,是局部变量,因此,这也证明了全局变量在函数内不可见.
2.7.2 全局变量
若要使全局变量在函数内可见,使用global:
x1 = 8
def f():
global x1
print(x1)
x1 = 9
print(x1)
f()
global x1表示x1是一个全局变量,注意global x1需要单独占一行.
2.7.3 非局部变量
用于嵌套函数中,使用nonlocal声明,表示内层函数的这个变量是外层函数的.
x1 = 8
def f():
x1 = 9
print(x1)
def f1():
nonlocal x1
print(x1)
x1 = 10
print(x1)
return f1
f()
f()()
第一个与第二个9都是f()中的print()输出的,第三个9是f1()中的print()输出的.
2.8 参数传递规则
当实参传递给形参时,有两种传递规则,一是值传递,而是地址传递.
2.8.1 值传递
当实参为不可变对象时,采用值传递规则,常见的不可变对象类型包括int,float,str,bool,tuple.
def f(x):
x = 1
print(x)
x = 3
print('-------int------')
f(x)
print(x)
print()
x = 'string'
print('-------str------')
f(x)
print(x)
print()
x = (3,4,5)
print('-------tuple------')
f(x)
print(x)
print()
x = 5.799
print('-------float------')
f(x)
print(x)
print()
2.8.2 地址传递
参数为可变对象时,采用地址传递规则,修改形参的值会同时改变实参的值.常见的可变对象类型包括list,set,dict.
def f(x):
if type(x) == list:
x = x.reverse()
elif isinstance(x,set):
x.add(8)
else:
x['0'] = 3
x = [1,2,3]
print('-------list------')
print(x)
f(x)
print(x)
print()
x = {4,5,6}
print('-------set------')
print(x)
f(x)
print(x)
print()
x = {'a':1,'b':2}
print('-------dict------')
print(x)
f(x)
print(x)
print()
2.9 lambda函数
lambda是一种特殊的自定义函数,使用关键字lambda进行定义,是一种匿名函数,函数体一般很短.
2.9.1 定义
以关键字lambda开头,后面是参数列表,参数列表结束后加一个冒号,后面是返回值.
y = lambda x:x*3
z = lambda x,y:x*y