函数
函数是带名字的代码块,用于完成具体的工作。
函数可以定义一些你要重复运行的一些任务,假如你定义了一段代码,而这段代码在后续还有很多地方需要用到的,就可以直接把这段代码定义位函数,然后下次调用的时候直接调用函数就可以了。
定义函数
使用def 来定义一个函数名,函数名是可以自己决定的
##使用def来定义函数此处NO_1被定义位函数
def NO_1():
###这个是字符段,python不会执行这个字符段,可以用作解释这个函数的作用,一般用三双引号,或者双单引号
"""
我是NO.1
:return:
"""
print("我是NO.1")
###直接调用函数名
NO_1()
向函数传递信息
定义一个函数不仅仅是让它单一的显示一段任务,有时候你还需要向函数传递参数来获得你想要的结果。
向一下定义函数时括号内的student叫形参,调用时括号内的叫实参。实参时调用函数时
##定义一个函数,括号内定义一个传参名
def greet_students(student):
###这里调用了形参
print(student + "是好学生")
##传递参数--字符串
greet_students('tanc')
作业
编写一个名为favorite_book()的函数,其中包含一个名为title的形参。这个函数打印一条消息,如 One of my favorite books is Alice in wonderland.调用这个函数,并将一本图书的名称作为实参传递给它。
##定义一个函数,在定义一个形参
def favorite_book(book):
print('One of my favorite books is Alice in '+book)
##调用函数吧实参wonderland提交给形参book
favorite_book('wonderland')
##执行
One of my favorite books is Alice in wonderland
传递实参
函数也可以包含多个形参,对应的调用函数也会包含多个实参。
位置实参,这要求实参的顺序和形参的顺序相同。
关键字实参,其中每个实参都由变量名和值组成
还可以使用列表和字典
位置实参
python中每个实参都会关联到函数定义中的一个形参,最简单的关联方式是基于实参的顺序,上面我们用student形参只调用了一个实参,接下来我们调用多个
##定义多个形参
def greet_students(student, room, ID):
print(room + '的'+ ID + '号'+student + "是好学生")
##调用多个实参
greet_students('tanc', 'jiwang-1', '18')
###你还可以调用多次
greet_students('xiaolan', 'jiwang-2', '21')
##执行
jiwang-1的18号tanc是好学生
jiwang-2的21号xiaolan是好学生
关键字实参
关键字是传递给函数的键值对。你可以在实参中将名和值关联起来
def greet_students(student, room, ID):
print(room + '的'+ ID + '号'+student + "是好学生")
##关键字传参
greet_students(student='tanc', room='jiwang-1', ID='18')
##这里我故意把参数写乱
greet_students(room='xiaolan', ID='jiwang-2', student='21')
##执行,可以看见不是按照顺序来
jiwang-1的18号tanc是好学生
xiaolan的jiwang-2号21是好学生
默认值
默认值就是在你定义 形参的时候直接给形参一个实参
def greet_students(student, room, ID='18'):
print(room + '的' + ID + '号'+student + "是好学生")
##这里没有给ID传参
greet_students(student='tanc', room='jiwang-1')
##这里传参了
greet_students(student='tancchang', room='jiwang-1',ID='18.')
##执行
jiwang-1的18号tanc是好学生
jiwang-1的18.号tancchang是好学生
返回值
在函数中,使用return语句将值返回到调用函数。
函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。
返回简单值
编写函数,它接受名和姓返回完整的姓名
def name(first_name,laste_name):
name = first_name+laste_name
##返回name
return name
my_name= name('谭', '畅')
print(my_name)
让实参变成可选的
有时候,需要让实参变成可选的,这样使用函数的人就只需在必要时才提供额外的信息。可使用默认值来让实参变成可选的。
###这里我把形参middle定义了一个默认值空字符串
def name(first_name, last_name, middle_name=''):
###判断是否与middle_name,应为python将非空字段都解读为True
if middle_name:
name = first_name + middle_name + last_name
else:
name = first_name + last_name
return name
my_name = name('谭', '畅')
print(my_name)
##注意这里中间名字按照排序实在最后面,所以使用位置传参就要写入最后面
my_name_0 = name('李', '强', '小')
print(my_name_0)
返回字典、元组、列表
函数还可以返回字典
def pets(type, name):
list = {'type': type, 'name': name}
return list
print(pets('dog','huahua'))
##列表
def pets(type, name):
list = [type,name]
return list
print(pets('dog','huahua'))
##元组
def pets(type, name):
list = (type,name)
return list
print(pets('dog','huahua'))
结合使用函数while循环
结合之前的定义用户的first_name、middle_name、last_name使用while循环语句和用户打招呼
def users(first_name, last_name, middle_name=''):
"""
返回用户的全名
:param first_name: 用户的性
:param last_name: 用户的二个名
:param middle_name: 用户的第三给名
:return: 全名
"""
if middle_name:
user_name = first_name + middle_name + last_name
else:
user_name = first_name + last_name
return user_name
##循环输入用的名和姓然后调用函数然后返回用户的全名,输入q就退出
while True:
first_name = input("input your first_name(input 'q' quit):")
if first_name == 'q':
break
middle_name = input("input your middle_name(input 'q' quit):")
if middle_name == 'q':
break
last_name = input("input your last_name(input 'q' quit):")
if last_name == 'q':
break
##如果middle为空就执行一下
if middle_name:
user_name = users(first_name, last_name)
##如果不为空执行
else:
user_name = users(first_name, last_name, middle_name)
print(user_name)
编写一个名为make_album()的函数,它创建一个描述音乐专辑的字典。这个函数应接受歌手的名字和专辑名,并返回一个包含这两项信息的字典。使用这个函数创建三个表示不同专辑的字典,并打印每个返回的值,以核实字典正确地存储了专辑的信息。
给函数make album()添加一个可选形参,以便能够存储专辑包含的歌曲数。如果调用这个函数时指定了歌曲数,就将这个值添加到表示专辑的字典中。调用这个函数,并至少在一次调用中指定专辑包含的歌曲数。
def make_album(singer_name, album_name, sing_num=''):
##如果sing_num为非空字节就执行
if sing_num:
album = {'singer_name': singer_name, 'album_name': album_name, 'sing_num': sing_num}
else:
album = {'singer_name': singer_name, 'album_name': album_name}
return album
album_0 = make_album('周杰伦', '八度空间')
##这里添加了歌曲数
album_1 = make_album('周杰伦', '叶惠美', '11')
print(album_0)
print(album_1)
传递列表
之前我要遍历一个列表就要写一段for循环,遍历一个写一个,现在可以吧for循环直接写入到函数中,然后直接用函数调用列表
def users(username):
for i in username:
print(i)
uesr_list = ['xiaming', 'xiaowang', 'xiaoqiang']
users(uesr_list)
###执行
xiaming
xiaowang
xiaoqiang
函数还可以修改列表,如果不想函数直接修改列表本身那就向函数传递的列表是副本而不是原件,
要将列表的副本传递给函数[ : ]表示创建列表副本
function_name(list_name[:])
传递任意数量的实参
再形参前*,就代表可以收集任意数量的实参
就是创建以一个形参命名的空元组,然后再将收到的所有值封装到这个元组中
def users(*user):
print(user)
users('xiaoqiang', 'xiaohon', 'xiaoliu')
##执行
('xiaoqiang', 'xiaohon', 'xiaoliu')
我们打出每个采访人的名字
def users(*user):
print("有一下受采访者")
##遍历元组
for i in user:
print('-'+i)
users('tanchang')
users('xiaoqiang', 'xiaohon', 'xiaoliu')
##执行
有一下受采访者
-tanchang
有一下受采访者
-xiaoqiang
-xiaohon
-xiaoliu
结合使用位置实参和任意数量实参
如果我们要统计每个编程语言的受采访人,我们就不能只用上面这种方法了,就要用位置和任意一起了
def users(code_laguage, *user):
print(code_laguage+"语言有一下受采访者")
for i in user:
print('-'+i)
users('python','tanchang')
print("\n")
users('java','xiaoqiang', 'xiaohon', 'xiaoliu')
##执行
python语言有一下受采访者
-tanchang
java语言有一下受采访者
-xiaoqiang
-xiaohon
-xiaoliu
使用任意数量的关键字实参
也就是再形参前加两个**,就代表可以接受任意数量的关键字形参,也就是说可以接受任意数量的键值对了,同时还可以接受任意数量的关键字参数
def user_list(first, last, **user_data):
user_profile = {}
user_profile['first_name'] = first
user_profile['last_name'] = last
for key, value in user_data.items():
user_profile[key] = value
return user_profile
data = user_list('tanc', 'chang', room='5317', gender='male')
print(data)
##执行
{'first_name': 'tanc', 'last_name': 'chang', 'room': '5317', 'gender': 'male'}
将函数存储在模块中
函数的优点之一是,使用它们可以将代码块与主程序分离,通过给函数指定描述名称,可让主程序容易理解得多。你还可以更进一步,将函数存储再称为模块的独立文件中,再将模块导入到主程序中。import语句允许再当前运行的程序文件中使用模块中的代码。
通过将函数存储独立的文件中,可隐藏程序代码的细节,将重点放在程序的高层逻辑上。这还能让你在众多不同的程序中重用函数。将函数存储在独立文件中后,可与其他程序员共享辽些文件而不是整个程序。知道如何导人函数还能让你使用其他程序员编写的函数库。
导入整个模块
要让函数是可导入的,得先创建模块。模块就是扩展名.py的文件,包含要导入到程序中的代码。
# coding=utf-8
"""
================================================================
author: Tan Chang
project:input_while_demo.py
file: import_total_module.py ##可以看见我的文件名
date:2021/11/2
================================================================
"""
##定义一个函数,传递三个形参
def users(first_name, last_name, middle_name=''):
"""
返回用户的全名
:param first_name: 用户的性
:param last_name: 用户的二个名
:param middle_name: 用户的第三给名
:return: 全名
"""
##如果middle_name不为空字符串就为真
if middle_name:
user_name = first_name + middle_name + last_name
else:
user_name = first_name + last_name
return user_name
-------------------------------------------
# coding=utf-8
"""
================================================================
author: Tan Chang
project:input_while_demo.py
file: function_demo.py ###文件名
date:2021/11/1
================================================================
"""
##导入模块再module目录下
import module.import_total_module ##就代表再module库下有个import_total_module模块
##调用
name = module.import_total_module.users('tanc','chang')
print(name)
###执行
tancchang
导入特定模块
你还可以导入模块中的特定函数
##导入模块中的特定函数
from module.import_total_module import users
##这里就可以直接调用user函数
name = users('tan', 'zhi', 'ping')
print(name)
还可以导入库中的特定模块
from module import import_total_module
name = import_total_module.users('tanc','chang')
print(name)
使用as给函数指定别名
如果要导入的函数的名称可能与程序中现有的名称冲突,或者函数名太长,就需要起别名你。
使用as给模块或者函数启别名
##使用as起别名
from module import import_total_module as user_module
from module.import_total_module import users as user_name
name = user_module.users('tan','chang')
name_0 = user_name('tan','chang')
print(name)
print(name_0)
##执行
tanchang
tanchang
导入模块中的所以函数
使用通配符*代表Python导入这模块中的年所有函数,或者说库中的所有模块
from module.import_total_module import *
##可以直接调用函数
name = users('tan', 'chang')
print(name)
##执行
tanchang