前言
python学习第11天,主要学习函数,内容具体包括:函数的定义、函数的调用、函数参数、函数返回值
一、函数
1.函数定义:
定义:在编程中,函数就是对实现某一特定功能的代码的封装。
不同的函数实现不同的功能。
2.函数分类:
从不同的角度函数可以分为多种类型,在python中根据函数是由谁定义的(创建的)角度将函数分为:系统函数、自定义函数。
系统函数由系统自带的,可以直接调用;
自定义函数:由程序员自己根据需要创建的函数(自己造机器)
3.自定义函数
语法:
def 函数名(形参列表):
函数说明文档
函数体
说明:
def ——关键字;固定写法
函数名 ——由程序员自己命名:
函数名要求:标识符要求、不是关键字
规范:见名知义(看到函数名就大概知道函数的作用)、所有的字母都小写,多个单词之间使用下划线隔开
不使用系统的函数名、类名和模块名
() ——固定写法
形参列表 ——以'变量名1, 变量名2, 变量名3,............'的形式存在,这儿的一个变量代表一个形参(也可以一个形参都没有)
形参的作用:把函数外部的数据传递到函数里面。
定义函数的时候需不需要形参就看实现函数的功能需不需要额外的数据。
函数说明文档—— 本质就是多行注释(相当于机器的说明书)
函数体 ——从结构上讲,函数体就是和def 保持一条或者多条语句
从作用上讲,函数体就是实现函数功能的代码。
函数体最核心的部分就是函数体
4.初学者定义函数的基本步骤
第一步:确定函数的功能(也就是确定这个函数要用来干什么,实现什么功能)
第二步:确定函数名字(根据函数功能确定函数名字)
第三步:确定函数参数(看实现函数的功能需不需要额外的数据,需要几个?)
第四步:实现函数功能(函数体),(将形参当成数据进行使用)
第五步:写函数说明文档
# 练习:定义一个函数求10的阶乘
def factorial_10():
"""
功能说明区:求10的阶乘
:return: (返回值说明区)
"""
sum1 = 1
for x in range(1, 11):
sum1 *= x
print(sum1)
# 练习:定义一个函数求任意一个数的阶乘
def factorial(num):
"""
求一个数的阶乘
:param num: (参数说明)需要求阶乘的数
:return: (返回值说明)None
"""
sum1 = 1
for x in range(1, num + 1):
sum1 *= x
print(sum1)
# 定义一个函数求任意两个数的和
def sum_xy(x, y):
"""
求任意两个数的和
:param x: 需要求和的第一个数
:param y: 需要求和的第二数
:return: (返回值说明)None
"""
print(x+y)
# 练习1: 定义一个函数统计字符串中中文的个数
def count_chinese(str1):
"""
求一个字符串中中文字符的个数
:param str1: 字符串
:return: count1
"""
count1 = 0
for x in str1:
if '\u4e00' <= x <= '\u9fa5':
count1 += 1
print(f'中文字数:{count1}')
# 练习2:写一个函数,提取列表中所有的数字元素
def extraction_of_digital(list1):
"""
提取列表中所有的数字元素
:param list1:
:return:
"""
result = [x for x in list1 if type(x) in (int, float)]
print(result)
# 练习3:写一个函数,获取指定字典中所有的值
def gain_values(dict):
"""
获取指定字典中所有的值
:param dict:
:return:
"""
result = [dict[x] for x in dict]
print(result)
dict1 = {'name': 'taiwan', 'age': 18}
dict2 = {'school':'qianfen', 'location': 'CD'}
gain_values(dict1)
gain_values(dict2)
# 练习4:写一个函数统计一个字符串中另外一个字符串出现的次数
def count_arise(str1, str2):
length1 = len(str1)
length2 = len(str2)
count = 0
index = 0
while index < length1:
if str1[index: index+length2] == str2:
count += 1
index += length2
else:
index += 1
print(count)
# 练习5:写一个函数将两个列表合并成一个字典(第一个列表的元素是键,第二个列表的元素是值)
def create_dict(list_key, list_value):
"""
将两个列表合并成一个字典。
注意:两个列表的长度必须一致,第一个列表的元素必须是不可变的元素
:param list_key: 提供键
:param list_value: 提供值
:return:
"""
length = len(list_key)
result = {list_key[index]: list_value[index] for index in range(length)}
print(result)
list1 = ['name', 'age', 'school']
list2 = ['zhangsan', 18, 'CD']
create_dict(list1, list2)
5.函数的调用
5.1 语法
语法:
函数名(实参列表)
说明:
函数名 ——需要调用的函数的函数名(必须是已经定义过的函数的函数名)
() ——固定写法
实参列表 ——以'数据1, 数据2, 数据3,...'的形式存在
实参是用来给形参赋值的,实参是真正从函数外部传到函数内部的数据
实参的个数由形参控制、影响
注意:同一个函数在需要使用的时候可以重复调用
5.2 函数调用过程
1)定义函数不会执行函数体,调用函数的时候才会执行函数体
2)执行过程:
第一步:回到函数定义的位置
第二步:传参(用实参给形参赋值)
第三步:执行函数体
第四步:确定函数返回值
第五步:回到函数调用的位置,接着往后执行
6.函数参数
6.1 位置参数和关键字参数
1)位置参数:
以‘数据1,数据2,数据3,.............’的形式存在,让实参和形参从位置是一一对应
(第一个实参给第一个形参赋值,第二个实参给第二个形参赋值...............)
2)关键字参数:
以‘形参1=实参1,形参2=实参2,形参3=实参3,..........’的形式存在
忽略位置
3)位置参数和关键字参数一起混用:
如果位置参数和关键字参数一起用,那么位置参数必须在关键字参数前面。
def func1(x, y, z):
print(f'x:{x}, y:{y},z:{z}')
func1(100, 200, 333) # x:100, y:200,z:333 给位置参数赋值时实参和形参要一一对应,实参个数要和形参个数相等
#func1(100, 200) # 报错 TypeError: fun1() missing 1 required positional argument: 'z'
#func1(111, 222, 333, 444) # TypeError: func1() takes 3 positional arguments but 4 were given
6.2 参数默认值 ——形参
定义函数的时候可以用‘形参=值’的方式给参数赋默认值;
影响:调用函数的时候有默认值的参数可以不用传参
如果定义函数的时候有的参数有默认值,有的参数没有默认值,没有默认值的参数必须在有有默认值的参数前面
def fun2(x=10, y=20, z=30):
print(f'x:{x}, y:{y}, z:{z}')
fun2()
fun2(100)
fun2(100, 200)
fun2(100, 200, 300)
fun2(y=200)
6.3 参数类型说明 ——形参
1)没有默认值的参数,在参数后加‘:类型名’
示例:def func5(str1:str):
2)有默认值的参数,值的类型就是参数的说明类型
def func1(str1: str):
pass
def func2(str1: str, list1: []):
pass
def func3(num: list, course: ''):
pass
6.4 不定长参数 ——形参
不定长参数就是指参数个数不确定,保证函数的调用的灵活性.
1)带*的不定长参数
在定义函数时可以在某个参数前面加*,那么这个带*的参数就是一个不定长参数,可以同时接收多个实参;
本质上:带*的参数会自动变成一个元组,接收到实参是元组中的元素。
2)带**的不定长参数(了解)
带**的参数在调用函数时,必须使用关键字参数进行传参。本质上是字典
# 思考:一个函数可不可以既有不定长参数又有定长参数?如果可以有没有什么问题存在(需要注意的地方)?
# 答:可以,
def func1(x, y, *a): # 位置参数在不定长参数前面
pass
func1(1, 2, 3, 4, 5, 6, 7) # 可以
def func2(*x, y=100): # 这种方式中带*参数(不定长参数)后面参数必须使用关键字参数
pass
def func3(x, *, b, c): # 此处的*的作用知识强迫调用func10的时候,表示传参时,参数b、c必须使用关键字参数进行传参
pass
7.函数返回值
问:什么时候需要返回值?
7.1返回值
1)返回值的意义:就是从函数内部传递到函数外部的数据
2)怎么确定函数返回值:返回值就是return 关键字后面的表达式值(执行函数体的时候如果遇到return,return后面是什么,函数返回值就是什么)
如果没有遇到return,返回值None
3)怎么在函数外部使用函数返回值:
函数调用表达式的值就是函数的返回值,所有返回值能做的事情,函数调用表达式都可以做
# 什么是函数调用表达式?答:就是调用函数的语句
#获取一个列表中的所有数字元素
def num_total(list1):
count = 0
list2 = []
for x in list1:
if type(x) in (int, float):
count += 1
list2.append(x)
return list2
list1 = [1, '《1991》', 1, '台湾', 69, 100]
result = num_total(list1)
print(result)
print(result*2)
7.1返回值
作用1:确定函数返回值
作用2:提前结束函数 — 如果执行函数体的时候遇到return,函数直接结束执行。一般和if语句结合使用。
总结
今日主要对python中函数的定义、函数分类、自定义函数、函数的调用、函数残烛、函数返回值等内容进行了学习。