1 模块函数
1.1 模块函数
模块函数指的是模块中的函数,模块函数有三种:
- 内置模块:又叫标准库
- 第三方开源模块:可以通过包管理工具进行安装
- 自定义模块
1.2 导入
导入语法主要有三种:
import ...
import ... as ...
from ... import ...
from ... import ... as ...
1.2.1 import
直接导入整个模块,import
后面直接加上模块名。
import math
math.e
1.2.2 import as
也是直接导入整个模块,import
后面是模块名,as
后面是别名,比如import math as m
,其中m
是math
的别名。
1.2.3 from import
从某个模块导入某个函数,from
后面是模块名,import
后面是函数名。
1.2.4 from import as
与上一种类似,从模块导入函数,只是为函数加上了别名。
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
2.9.2 调用
调用可以通过"函数名"调用,或者配合其他函数使用。