带名字的代码块,用于完成具体的工作
在程序中多次执行一项任务时,可调用执行该任务的函数
1. 定义函数
使用关键字def
来告诉Python,接下来是定义一个函数,并以:
结尾
函数名后面的所有缩进构成函数体
函数大多有“文档字符串”(docsting),用来描述函数的作用,用三引号括起来,使用其来生成有关程序中的函数文件
def message():
'''显示简单的问候'''
print('hello')
# 调用函数
message() # hello
在函数名括号内定义变量,就可让函授接受给变量指定的任意值
def message(name):
'''显示简单的问候'''
print('你好' + name)
# 调用函数,并指定name的值
message('jing') # 你好jing
上述例子中,函数名的name变量是形参;调用函数时的“jing”是实参
形参:函数完成工作所需要的一项信息
实参:调用函数时传递给函数的信息
2. 传递实参
函数可能包含多个形参,因此调用的时候也有多个实参
2.1 位置实参
位置实参:基于实参顺序,要求与形参顺序相同
def message(name, like):
'''显示自我信息'''
print('我是' + name)
print('喜欢' + like)
# 函数调用时,实参jing、玩游戏分别存储在形参name、like中
message('jing', '玩游戏') # 我是jing 喜欢玩游戏
# 可多次调用函数,只需在调用函数时,描写相关实参即可
message('a', 'b') # 我是a 喜欢b
2.2 关键字实参
传递给函数实参直接用=
定义,不需要考虑位置,还可清楚的指出函数调用中各个值得用途
def message(name, like):
'''显示自我信息'''
print('我是' + name)
print('喜欢' + like)
# 函数调用时,指定实参jing、玩游戏分别存储在形参name、like中
message(name = 'jing', like = '玩游戏') # 我是jing 喜欢玩游戏
2.3 默认值
在编写函数时,可给每个形参一个默认值。如果调用函数时提供了实参,就用指定的实参值;否则就用默认值
一般先写没有默认的形参,在写有默认值的形参,保证Python能正确解读位置实参
def message(name, like = '玩游戏'):
'''显示自我信息'''
print('我是' + name)
print('喜欢' + like)
# 函数调用时,实参jing存储在形参name中,形参like用默认值
message(name = 'jing') # 我是jing 喜欢玩游戏
在使用函数时,如果遇到实参不匹配错误,可能是提供的实参多于、少于函数完成其工作所需要的信息
以上的传递实参都是等效的函数调用,用哪种方式无关紧要,只要函数调用能生成希望的输出结果就行
3. 返回值
函数返回的值称为返回值
在函数中,可使用return
语句将值返回到调用函数的代码行
def message(name, like):
'''显示自我信息'''
a = '我是' + name + ',喜欢' + like
return a
# 调用返回值时需要一个变量用于存储返回值
b = message(name = 'jing', like = '玩游戏')
print(b) # 我是jing,喜欢玩游戏
使用默认值让实参变得可选
# 要有个空字符串,否则会出现实参不匹配错误
def message(name, like, age = ''):
'''显示自我信息'''
# 用if检测可选形参是否有实参
if age:
a = '我是' + name + ',' + str(age) + '岁,喜欢' + like
else:
a = '我是' + name + '喜欢' + like
return a
b = message(name = 'jing', like = '玩游戏')
print(b) # 我是jing喜欢玩游戏
c = message(name = 'jing', like = '玩游戏', age = 18)
print(c) # 我是jing,18岁,喜欢玩游戏
函数可返回任意形式的值(字典、列表)
def message(name, like, age = ''):
'''显示自我信息'''
if age:
a = {'姓名' : name, '年龄' : age, '爱好' : like}
else:
a = {'姓名' : name, '爱好' : like}
return a
b = message(name = 'jing', like = '玩游戏')
print(b) # {'姓名': 'jing', '爱好': '玩游戏'}
c = message(name = 'jing', like = '玩游戏', age = 18)
print(c) # {'姓名': 'jing', '年龄': 18, '爱好': '玩游戏'}
结合函数和while循环
def message(name, like):
'''显示自我信息'''
a = '我是' + name + ',喜欢' + like
return a
print('输入no就停止')
while True:
name = input('请输入姓名')
# 设置while循环停止条件
if name == 'no':
break
like = input('请输入爱好')
# 调用函数,传递实参
a = message(name, like)
print(a)
4. 传递列表
用函数遍历列表
# 定义一个编列列表的函数
def 遍历列表(names):
'''遍历列表'''
for name in names:
print(name)
a = ['甲', '乙']
# 调用函数遍历a列表
遍历列表(a) # 甲 乙
在函数中修改列表,改变原来列表
def 移动列表(names, friends):
'''
列表之间移动元素
将names的元素移动到friends中
'''
# while循环移动并添加列表中的元素
while names:
friends.append(names.pop())
a = ['甲', '乙']
b = ['丙', '丁']
# 调用列表,把a元素移动到b中
修改列表(names = a, friends = b) # ['丙', '丁', '乙', '甲']
# 检验a,b列表
a # []
b # ['丙','丁', '乙', '甲']
多个函数综合使用
a = ['甲', '乙']
b = ['丙', '丁']
# 调用移动列表函数(具体函数见上述例子)
移动列表(a, b)
遍历列表(b) # 甲 乙 丙 丁
修改列表时,不改变被修改列表
def 移动列表(names, friends):
'''
列表之间移动元素(不改变原列表)
将names的元素移动到friends中
'''
while names:
friends.append(names.pop())
a = ['甲', '乙']
b = ['丙', '丁']
# 调用移动列表函数
移动列表(a[:], b)
a # ['甲', '乙']
b # ['丙', '丁', '乙', '甲']
5. 传递任意数量实参
大多数都不能预先知道接收多少个实参
# 定义一个修改函数,只有一个形参,但是可接纳不止一个实参
def name(*names):
'''显示所有名字'''
for name in names:
print(name)
name('甲') # 甲
name('甲', '乙', '丙') # 甲 乙 丙
如果要让函数接收不同类型的实参,必须在函数定义中将接纳任意实参的形参放在最后
Python先匹配位置实参和关键字实参,再将余下的实参收集到最后一个形参中
结合位置实参和任意数量实参
# 位置形参在前,任意数量形参在后
def name(种类, *names):
'''显示名字和其他信息'''
print(种类 + ':')
for name in names:
print('\t' + name)
name('人类', '甲') # 人类: \t\n甲
name('人类', '甲', '乙', '丙') # 人类: \t\n甲 \t\n乙 \t\n丙
函数可接受任意数量的键-值对
def message(姓名, 性别, **其他信息):
'''显示一个人的所有信息信息'''
# 创建一个空字典
people = {}
people['姓名'] = 姓名
people['性别'] = 性别
# 遍历其他信息中的键值对
for key, value in 其他信息.items():
# 将其他信息中的键值对加入people字典中
people[key] = value
return people
a = message("甲", "女", 种类 = '人种', 头发 = '红色')
a # {'姓名': '甲', '性别': '女', '种类': '人种', '头发': '红色'}
将键值对传进函数作为实参传进函数时,不能写'键'='值',应该写键='值'
在操作字典时,键确实需要加''
,但是此处应该遵守关键字实参的传递规则
6. 将函数存储在模块中
函数能够将代码和主程序分开,def
指定函数,让主程序容易理解
函数可另外存储在模块(独立文件)中,需要用时将模块导入到主程序中即可,这样可隐藏程序代码细节,将重点放在程序的高层逻辑上
模块是扩展名为.py
的文件夹,能够使函数可被导入
import
语句能够在主程序中运用模块
jupyter中py程序的后缀是ipynb
'''message.ipynb模块'''
def 族群(族群名, *成员s):
'''描述群体及组成这个群体的名字'''
族群 = {}
族群[族群名] = 成员s
return 族群
def 个人信息(姓名, 性别, **其他信息):
'''
显示一个人的所有信息信息
其他信息:键值对形式的实参
'''
个人信息 = {}
个人信息['姓名'] = 姓名
个人信息['性别'] = 性别
for key, value in 其他信息.items():
个人信息[key] = value
return 个人信息
6.1 导入模块
调用模块,需要把.ipynb文件转变为.py文件
file--download as--python file
保存之后,在当前文件夹中,可以看到多了一个.py的文件
如果没有相应的.py文件(可能是默认下载地址),可将下载的.py文件复制到jupyter文件的文件夹中,刷新网页后,即可看到相应的.py文件
用jupyter的快速命令符%run
# 加载了文件,相当于导包
%run message.py
# 直接调用文件中的函数
a = 族群('人', '甲', '乙', '丙', '丁')
a # {'人': ('甲', '乙', '丙', '丁')}
# 把代码显示出来
%load message.py
import
加载包的形式加载.py文件
import message
# 调用文件中的某个函数
message.族群('人', '甲', '乙', '丙', '丁') # {'人': ('甲', '乙', '丙', '丁')}
# 显示文件存储位置
reload(message) # <module 'message' from 'E:\\code\\python\\message.py'>
import
导入模块时,通过as
给模块指定别名
import message as m
m.族群('人', '甲', '乙', '丙', '丁') # {'人': ('甲', '乙', '丙', '丁')}
6.2 导入模块中函数
from
import
导入指定函数
# 通过“,”可从一个模块中调用多个指定函数:from 模块名 import 函数名1, 函数名2, ····函数名n
from message import 族群
族群('人', '甲', '乙', '丙', '丁') # {'人': ('甲', '乙', '丙', '丁')}
如果主程序中与被模块调入的函数名一致,可将模块中的函数名取一个别名,类似于外号
关键字as
,将在导入模块函数时指定函数别名
# 指定函数别名
from message import 族群 as zq
# 用函数别名调用函数
zq('人', '甲', '乙', '丙', '丁') # {'人': ('甲', '乙', '丙', '丁')}
导入所有函数
from message import *
# 调用函数
族群('人', '甲', '乙', '丙', '丁') # {'人': ('甲', '乙', '丙', '丁')}
目录
一、搭建编程环境
二、变量和简单数据类型
三、列表
四、if语句
五、字典
六、用户输入和while循环
七、函数
八、类
九、文件和异常