Day9 函数基础
2019-08-01 本文已影响0人
风月辞寒
一.函数概论
1.什么是函数
函数就是对实现特定功能的封装
2.函数的分类
系统函数(内置函数) - 系统已经声明好的函数(类似已经造好的机器), 程序员会用就行
例如: print\input\sum\max\hex\len\id\type等...
自定义函数 - 程序员自己声明的函数(自己造机器)
3.声明函数
1)语法:
def 函数名(形参列表):
函数说明文档
函数体
2)说明:
def - python中声明函数的关键字(固定写法)
函数名 - 和变量名的要求一样
(): - 固定写法
形参列表 - 以'变量名1,变量名2,变量名3,...'的形式存在; 每个变量就叫形参
形参的个数根据数据情况可以没有也可以有多个
形参的作用是将函数外部的数据传递到函数里面
函数说明文档 - 用三个双引号引起来的字符串;作用是对函数的功能进行说明
函数体 - 和def保持一个缩进的一行或多行语句 (实现函数功能的多条语句)
3)初学者声明函数的步骤
a.确定函数的功能
b.根据函数的功能确定函数名
c.确定函数的参数: 看实现函数的功能需不需要从外面传值, 需要几个?
d.实现函数的功能
注意(特别重要): 声明函数的时候是不会执行函数体的
写一个函数, 求两个数的和
def sum_1(num_1, num_2):
"""
函数功能说明部分 - 求和
:param num_1: 参数说明 数字1
:param num_2: 数字2
:return: 返回值说明
"""
return print(num_1 + num_2)
if __name__ == '__main__':
num1, num2 = 12, 23
sum_1(num1, num2)
4.函数的调用 (调用函数就相当于使用机器)
1)语法
函数名(实参列表)
2)说明
函数名 - 已经声明过的函数的函数名
() - 固定写法
实参列表 - 以'值1, 值2, 值3,...'形式存在; 这儿的每个值就叫实参;
实参是用来给形参赋值的
同一个函数可以调用多次
def sum_1(num_1, num_2):
"""
函数功能说明部分 - 求和
:param num_1: 参数说明 数字1
:param num_2: 数字2
:return: 返回值说明
"""
return print(num_1 + num_2)
sum_1(1, 2)
sum_1(3, 2)
sum_1(5, 2)
二.函数的调用
1.函数调用过程
1)语法
函数名(实参列表)
2)调用函数的作用: 执行函数体; 获取返回值
3)函数的调用过程:
第一步: 先回到函数声明的位置
第二部: 传参(用实参给形参赋值)
第三部: 执行函数体
第四部: 执行完函数体就确定返回值
第五步: 回到函数调用的位置接着往后面执行
# 声明一个函数,实现求1+2+3+N的和
def sum_n(num: int):
sum1 = 0
for n in range(1, num + 1):
sum1 += n
return sum1
# 声明一个函数, 打印字符串中所有的字母字符
def letters1(str1: str):
new_str1 = ''
for s in str1:
if s.isalpha():
new_str1 += s
return new_str1
# 声明一个函数,在指定的字符串中数字字符后面都添加一个指定的字符
def letters2(str1: str, char: str):
for s in str1:
if s.isdigit():
str1 = str1.replace(s, s+char)
return str1
if __name__ == '__main__':
print(sum_n(100))
print(letters1('asd123!@#jkl'))
print(letters2('asd123b3b4b5', '='))
三.函数的参数
1.位置从参数和关键字参数(针对实参)
根据调用函数的时候传参的方式将参数分为未知参数和关键字参数
1)位置参数: 让实参和形参在位置上一一对应(第一个实参给第一个形参赋值,第二个实参给第一个形参赋值...)
2)关键字参数: 以'形参名=值'的形式传参
注意: 位置参数和关键字参数可以一起使用, 但是一起使用的时候要求位置参数必须在关键字参数的前面
3)什么时候使用关键字参数: 需要跳过前面某个或某几个参数, 直接给后面某个参数赋值的时候必须使用关键字参数
def func1(a, b, c):
print('a:{}, b:{}, c:{}'.format(a, b, c))
# 未知参数传参
func1(10, 20, 30)
# 关键字传参
func1(a=100, b=200, c=300)
func1(a=100, c=300, b=200)
# 位置参数和关键字参数同时使用
func1(10, c=100, b=22)
2.参数默认值
声明函数的时候; 形参可以设置默认值, 设置完默认值后调用函数的时候有默认值的参数可以不用传参
一个函数可以给所有的参数都设置默认值, 也可以给部分参数设置默认值; 必须保证没有默认值的参数必须放在有默认值参数的前面
def func2(x, y=0, z=0):
print('x:{}, y:{}, z:{}'.format(x, y, z))
func2(100, z=100)
3.参数类型说明(方便在函数体中有代码提示)
1)给参数赋默认值, 默认值得类型就是参数的类型
2)以'参数名: 类型名'的形式声明函数
def func3(x: int, y: str, z: list):
print('x:{}, y:{}, z:{}'.format(x, y, z))
func3(90, 'qwe', [123, 23])
4.不定长参数
1)在形参的前面加一个, 那么这个参数就可以同时接受多个实参; 带的参数会作为一个元组, 对应的多个实参是元组中的元素
2)在形参前加, 那么这个参数也可以同时接受多个实参(关键字参数, 关键字自己随便命名) 将带的参数作为一个字典, 将关键字参数的关键字作为key实参作为value存储在字典中
def func(*args, **kwargs)
# 写一个函数计算多个数的和
# sum1(1), sum1(2, 45), sum1(1, 2, 3, 4,...)
# def func5(*nums: int, a: int):
def func6(a: int, *nums: int):
print(nums)
print(a)
return sum(nums)
# print(func5(1, 2, 3, 4, 5, a=10))
print(func6(1, 2, 3, 4, 5, 6))
def func7(**nums):
print(nums)
func7(a=1, b=2, c=3)
# *args 和 **kwargs一起用是为了保证不定长参数传参的时候既可以使用位置参数也可以使用关键字参数
补充:
*的用法: *列表/*元组 -> 直接取出列表/元组的元素
**字典 -> 直接取出字典中的所有元素
list1 = [80, 90, 100]
print(list1)
print(*list1)
dict1 = {'a': 1, 'b': 2}
def func8(b, a):
print(a, b)
func8(**dict1)
# 练习: 声明一个函数,求多个数的差
# differ(1, 2) -> differ(10, 2, 3) -> 5
def differ(num1=0, *nums):
return num1 - sum(nums)
list1 = []
print(differ(*list1))
四.函数的返回值
1.什么是返回值
返回值就是return关键字后表达式的值 (怎么确定函数的返回值)
返回值就是函数调用表达式的值 (怎么获取函数的返回值)
(python中所有函数都有返回值,默认为None)
1)什么是return
return是函数体中的关键字(只能在函数中使用), 作用有两个: 结束函数/确定函数返回值
a.结束函数: 执行函数体时只要遇到return函数直接结束
b.确定函数的返回值: return 返回值(可以是具体的数据, 声明过的变量, 运算表达式)
2)什么是函数调用表达式
函数调用语句就是函数调用表达式, 例如: func1(10), max([1, 2]), 每个调用函数的语句都有结果, 这个结果就是调用这个函数得到的返回值
def func1():
for x in range(10):
print(x)
return 100
print('函数体里面')
print(func1())
2.怎么用返回值
想要用函数的返回值, 就是用函数调用表达式的值
普通数据能做的事情, 函数调用表达式都可以做
3.什么时候需要返回值
初学者: 看实现函数的功能会不会产生新的数据
return 返回值1,返回值2,...