python函数用法
1.基本格式
def greet_user():
"""显示简单问候语"""
print('hello')
greet_user()# 函数调用
- 关键字def
- 不要忘记括号
- 不要忘记冒号
- 不要忘记缩进
2.传递参数
case1
def greet_user2(username):
print('hello:'+username.title())
greet_user2('xiaoming')
hello:Xiaoming
3.形参和实参
- 函数中定义的参数形参
- 调用的时候穿的参数实参数
def greet_user3(username, age): # 形参
print('your name is :'+ username+'and age is:'+str(age))
greet_user3('xiaohong', 18) # 实参
4.位置实参
实参与形参根据位置排列传递
case1
def desc_pet(animal_type, petName):
"""显示宠物信息"""
print('animal type is :'+ animal_type + ", name is :"+ petName)
desc_pet("dog",'小柴')
输出
animal type is :dog, name is :小柴
5.关键字实参
- 调用时直接使用形参名称传值
case
def desc_pet2(animal_type, pet_name):
"""显示宠物信息"""
print('animal type is :' + animal_type + ", name is :" + pet_name)
desc_pet2(animal_type='cat', pet_name='harry')
6.默认值
- 是指形参中的默认值
- 指定后可以在调用时不必传值
- 无默认值的形参要放在前面,带默认值要放在后面,否则报错not default value,原因是实参仍然会把第一个当做位置实参
case
# 形参默认参数
def desc_pet3(pet_name, animal_type= 'dog' ):
"""显示宠物信息"""
print('animal type is :' + animal_type + ", name is :" + pet_name)
desc_pet3(pet_name='harry')
输出
animal type is :dog, name is :harry
7.等效调用
- 由于位置实参和关键字实参,因此可以混合使用,只要得到想要结果就可
case
def desc_pet4(pet_name, animal_type='dog' ):
"""显示宠物信息"""
print('animal type is :' + animal_type + ", name is :" + pet_name)
# 1.
desc_pet4(pet_name='harry')
# 2.
desc_pet4('harry')
# 二者调用方式都可
desc_pet4('tom', 'cat')
desc_pet4(pet_name='tom', animal_type='cat')
输出
animal type is :dog, name is :harry
animal type is :dog, name is :harry
animal type is :cat, name is :tom
animal type is :cat, name is :tom
8.实参错误
- 形参无默认值,实参无值会报错
case
# 实参错误
def desc_pet5(animal_type, pet_name):
"""显示宠物信息"""
print('animal type is :' + animal_type + ", name is :" + pet_name)
desc_pet5()
报错
Traceback (most recent call last):
File "C:\Users\Quinn\PycharmProjects\pythonProject\function1.py", line 62, in <module>
desc_pet5()
TypeError: desc_pet5() missing 2 required positional arguments: 'animal_type' and 'pet_name'
9.返回值
函数具有返回值
# 返回值函数
def desc_pet6(animal_type, pet_name):
message = 'animal type is :' + animal_type + ", name is :" + pet_name
return message
message = desc_pet6('dog', 'tom')
desc_pet6(message)
输出
animal type is :cat, name is :tom
10.实参可选
- 实参指定默认值尾空字符,``
- 原因是python会识别成true,也就不会报错了
case
def get_format_name(first_name, last_name, middle_name=''):
if middle_name:
format_name = first_name + ' ' + middle_name + ' ' + last_name
else:
format_name = first_name + ' ' + last_name
return format_name
format_name1 = get_format_name('jimi', 'hendic')
format_name2 = get_format_name('john', 'hooker', 'lee')
print(format_name1)
print(format_name2)
输出
jimi hendic
john lee hooker
- 如果不指定中间名有默认值,那么如果某个人没有中间名,那只传入两个参数一定会报错
- 上述指定中间值为空字符"",则if条件不执行走else,若中间名有值,那就不是空字符if通过
11.返回字典
- 可返回任何复杂数据结构,如字典、列表、元组
case
# 返回字典
def build_person(first_name, last_name, middle_name = ''):
person = {'first_name:': first_name, 'last_name': last_name}
if middle_name:
person['middle_name:'] = middle_name
return person
person1 = build_person('jimi', 'hendic')
person2 = build_person('john', 'hooker', 'lee')
print(person1)
print(person2)
输出
{'first_name:': 'jimi', 'last_name': 'hendic'}
{'first_name:': 'john', 'last_name': 'hooker', 'middle_name:': 'lee'}
12.传递列表
case
# 传递列表
def greet_user7(usernames):
"""向列表中的每一个人问候"""
for username in usernames:
msg = 'hello:' + username
print(msg)
greet_user7(['jerry', 'tom'])
运行结果
hello:jerry
hello:tom
13.在函数中修改列表
- 函数外一个列表,然后以参数传入函数内,在函数内对列表修改,也会修改外部列表,说明函数内修改列表与函数外列表是一个列表
case
# 在函数中传递列表
def print_models(unprinted_designs, completed_models):
"""
模拟打印每个设计,知道没有打印的设计为止
打印每个设计后,都将其移动到打印完的列表中
"""
while unprinted_designs:
current_design1 = unprinted_designs.pop()
# 模拟根据设计制作3D答应你模型的过成
print('printing model:' + current_design1)
completed_models.append(current_design1)
def show_completed_models(completed_models):
"""显示所有打印好的模型"""
print("\n打印好的模型有:")
for completed_model1 in completed_models:
print(completed_model1)
unprinted_designs1 = ['iphone case', 'rebot pendant', 'dodecahedron']
completed_models1 =[]
print_models(unprinted_designs1, completed_models1)
show_completed_models(completed_models1)
print(unprinted_designs1)
输出
printing model:dodecahedron
printing model:rebot pendant
printing model:iphone case
打印好的模型有:
dodecahedron
rebot pendant
iphone case
[]
14.禁止函数修改列表
- 外部定义的列表,作为参数传入函数内部,函数内部修改列表,也会修改外部列表,如何禁止修改?
- 将列表的副本传递进去
列表名 = ['case1']
调用函数名(列表名[:])#切片表示把列表副本传入
case1 使用列表副本
# 列表副本
list1 = ['xiaoming', 'xiaohong', 'xiaopang']
def dispose_name(names):
# 把所有名字全部移除
while names:
names.pop()
dispose_name(list1[:])
print(list1)
结果
['xiaoming', 'xiaohong', 'xiaopang']
case2 直接传入列表
def dispose_name(names):
# 把所有名字全部移除
while names:
names.pop()
dispose_name(list1)
print(list1)
运行结果
[]
15.传递任何数量实参
def 函数名(*形参名)
*形参名表示创建了一个空元组,把所有的实参都放进里面了
case1
# 传递任何数量的实参
def make_pizza(*toppings):
"""打印顾客点的所有配两"""
print(toppings)
make_pizza('配料1')
make_pizza('配料2', '配料2')
运行结果
('配料1',)
('配料2', '配料2')
16.位置实参+任意数量实参
要混合使用注意
- 任意数量实参永远放在最后
- python会首先匹配位置实参和关键字实参,最后才是任意数量实参
# 任意位置实参+位置实参
def make_pizza2(size, *toppings):
"""打印顾客点的所有配两"""
print('\nMaking a ' + str(size) + '-寸 pizza ,有以下配料:')
for topping in toppings:
print('- ' + topping)
make_pizza2(16, '配料1')
make_pizza2(15, '配料2', '配料2')
输出
Making a 16-寸 pizza ,有以下配料:
- 配料1
Making a 15-寸 pizza ,有以下配料:
- 配料2
- 配料2
17.函数存储在存储块中
把函数分离单独存储在模块中,用的时候在导入
- 创建模块
把要存储函数直接放到一个.py文件中
case 存储在model.py
def make_pizza2(size, *toppings):
"""打印顾客点的所有配两"""
print('\nMaking a ' + str(size) + '-寸 pizza ,有以下配料:')
for topping in toppings:
print('- ' + topping)
2.导入模块
创建一个import.py
语法
import 模块名
模块名.方法名()
case
import model
model.make_pizza2(16, '配料1')
model.make_pizza2(15, '配料2', '配料2')
18.导入特定函数
from 模块名(文件名) import 函数名[,函数2,函数3]
- []不算
- 多个函数用逗号分隔
- 用的时候直接写函数名,不需要模块名.函数名()
case
from model import make_pizza2
make_pizza2(16, '配料1')
- 指定函数别名使用
from 模块名 import 函数名 as 别名
case
from model import make_pizza2 as pz
pz(16, '配料1')
-- 指定模块别名import 模块名 as 模块别名
import model as m
m.make_pizza2(16, '配料1')
- 导入模块中所有函数
from 模块名 import *此时使用模块中的函数不在需要使用模块名.函数名了,直接使用(不推荐用法)
19.函数编写指南
- 函数名只用下划线和小写字母
- 注释紧跟函数定义后,采用文档注释
- 形参指定默认值=号两边不要有空格
- 关键字实参等号两边不要有空格
- 代码行长度不要超过79字符
- 若形参参数名过长可以在左括号按回车,并在下一行按两次tab后再输入形参
- 多个函数之间间隔可以用两个空行分隔