Python学习笔记三:函数
函数
1. 定义
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。文档字符串用三引号(""" """)括起来。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
- 因为函数相对独立,所以定义函数的上方(根据PEP8的要求)需要和上其他代码(包括注释)隔开两个空行
def greet_user(user): """显示简单的问候""" print("hello!%s%s" % (user, '。')) # 函数的调用 greet_user('Smith')
注意:
- 定义一个函数,只表示封装了一段代码,如果不主动调用,函数不会自行运行,所以在进行断点调试时,不会有任何结果显示
- 基于Python的执行顺序是从上到下,所以如果想要调用一个函数,必须在调用函数前,声明定义这个函数,否则会报错
2. 参数
在定义函数时,函数名后括号内跟着的变量是形参,用来接收参数,在函数内作为变量使用。
调用函数时,指定的具体字符是实参。是用来将数据传递到函数内部的。
以函数greet_user()为例,user是形参,'Smith'就是实参。函数在调用时,会将实参传递给函数,存储在形参里。
2.1 位置实参
一个函数中可以包含多个形参,也可以传递多个实参。
传递实参的方法有很多,其中最常用的是位置实参和关键字实参两种。
位置实参:在向函数传递参数时,形参的位置和实参的位置一一对应,这样的实参叫位置实参。
def describe_animals(animal_type, pet_name): """显示宠物信息""" print("I have a %s。" % animal_type) print("It's name is %s。" % pet_name) describe_animals('cat', 'kitty')
注意:在传递位置实参时,形参和实参的对应位置非常重要。虽然不会报错,但结果可能会让人啼笑皆非
describe_animals('kitty', 'cat') I have a kitty。 It's name is cat。
2.2 关键字实参
在调用函数时,明确给出各个形参所对应的实参,这就是关键字实参。
def describe_animals(animal_type, pet_name): """显示宠物信息""" print("I have a %s。" % animal_type) print("It's name is %s。" % pet_name) describe_animals(animal_type='cat', pet_name='kitty')
2.3 默认值
在声明函数时,可以事先给形参指定默认值,这样调用时,可以只调用没有默认值的形参。
注意:使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的实参。这让Python依然能够正确地解读位置实参。
def describe_animals(animal_type, pet_name='kitty'): """显示宠物信息""" print("I have a %s。" % animal_type) print("It's name is %s。" % pet_name) describe_animals(animal_type='cat')
2.4 传递任意数量的实参
函数形参前的*号,表示创建一个形参名称的元组,待调用函数时,Python会将传递进来的实参,全部封装进这个元组。
不管传递进来多少个实参,都会被封装进一个元组内。
def make_pizza(*toppings): """打印制作披萨的所有食材""" print("Making a piece of pizza with following toppings:") for topping in toppings: print(topping) make_pizza('mushrooms', 'green peppers', 'extra cheese')
注意:传递多个参数,而不是传递一个含有多个元素的元组
① 结合位置实参和任意数量实参
如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在后面。Python先匹配位置实参和关键字实参,再将余下的实参都封装到最后一个形参中。
def make_pizza(size, *toppings): """显示制作披萨的所有用料""" print("Make a %d-inch pizza。" % size, end='') print("With following toppings:") for topping in toppings: print(topping) make_pizza(12, 'cheese', 'onion', 'mushrooms')
② 任意数量的位置实参和默认值
默认值和任意数字的位置实参结合时,默认值要放在前面。
def make_pizza(size=10, *toppings): """显示制作披萨的所有用料""" print("Make a %d-inch pizza。" % size, end='') print("With following toppings:") for topping in toppings: print(topping) make_pizza(12, 'cheese', 'onion', 'mushrooms')
③ 任意数量的关键字实参
函数形参前加上**,创建一个形参名称的字典,待调用函数时,Python会传递进来的实参,全部封装到这个字典中。
def make_pizza(size, **toppings): """打印纸多披萨所需的原材料""" print("Make a %d-inch pizza with following toppings:" % size) topping = {} for key, value in toppings.items(): topping[key] = value print(key.title()+':') print(value) make_pizza(size=10, vegetable='Cucumber', meat='bacon', seasoning='salt')
④ 任意数量的关键字实参和默认值
def make_pizza(size=10, **toppings): """打印纸多披萨所需的原材料""" print("Make a %d-inch pizza with following toppings:" % size) topping = {} for key, value in toppings.items(): topping[key] = value print(key.title()+':') print(value) make_pizza(size=12, vegetable='Cucumber', meat='bacon', seasoning='salt')
总结:在Python中,函数的参数位置应该按照以下顺序排序:
- 位置参数(必须参数)
- 默认值参数
- 可变成位置参数(既:任意数量的位置参数)
- 可变长关键字参数(既:任意数量的关键字参数)
def my_func(a, b, c=0, *args, **kwargs): pass my_func(1, 2, 3, 4, 5, x=6, y=7) 1,2是位置参数;3是默认值参数;4,5是可变长位置参数;x和6是关键字参数,被封装到kwargs名称的字典传递给函数。
3. 返回值
4. 变量
变量分为局部变量和全局变量,局部变量的作用域为函数体,
将局部变量声明为全局变量,可以使用global关键字,这样在函数体内部声明的局部变量,就变成一个全局变量
# 在函数体内声明一个全局变量 global var var = value
模块
1. 定义
在Python中,模块是一个包含Python代码的文件,它可以包含函数、类、变量和常量等。模块可以被其他Python程序导入并使用,这样可以避免重复编写代码,提高代码的复用性和可维护性。
简单来说,每个带.py后缀的文件就是一个模块。
Python中的模块可以是标准库模块、第三方模块或自定义模块。标准库模块是Python自带的模块,包含了大量的常用功能,例如操作系统接口、文件I/O、字符串处理、网络通信等。第三方模块是由其他开发者编写的模块,可以通过pip等包管理工具安装。自定义模块是由开发者自己编写的模块,可以根据需要定义函数、类、变量和常量等。
2. 模块名
在Python中,模块名也是一个标识符,所以遵循:
- 标识符由数字,字母和下划线组成
- 不能以数字开头
- 标识符的长度没有限制,但为了方便使用,尽量做到简单明了
- 区分大小写
- 尽量避免使用系统自带的关键字,例如:if,else,while,print等等
3. 模块的使用
① import语句
模块定义好后,我们可以使用import语句来引入模块,具体语法:
import module1[,module2,...modulen] module.function
例如我们想要使用test1.py内的print_line()函数,用法如下:
# 导入模块 import test1 # 调用test1.py中的print_line()函数 test1.print_line()
② from...import语句
Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中。语法如下:
from module import function1[,function2,...functionN]
有时为了方便,我们会使用as给指定函数起别名,之后此函数名要使用别名,而不是原来的名字
from test1 import print_line as pl
③ 使用*导入模块内的所有函数
from module import *