python函数理论
2019-08-01 本文已影响0人
举颗凤梨
函数理论
1.什么是函数
- 函数就是对实现特定功能的代码的封装
2.函数的分类
- 系统函数(内置函数) - 系统已经声明好的函数(类似已经造好的机器),程序员会用就行.
例如:print.input,max,min,type,len - 自定义函数 - 程序员自己声明的函数(自己造机器).
3.声明函数
1)语法:
def 函数名(形参列表):
函数说明文档
函数体
2)说明:
- def - python中声明函数的关键字(固定写法)
- 函数名 - 和变量名的要求一样
- (): - 固定写法
- 形参列表 - 以'变量名1,变量名2,...'的形式存在,每个变量就是形参.
形参的个数根据情况可以没有也可以有多个.
形参的作用是将函数外面的数据传递到函数里面. - 函数说明文档 - 用三个双引号引起来的字符串,作用是对函数的功能进行说明.
- 函数体 - 和def保持一个缩进的一行或者多行语句.(实现函数功能的多条语句)
3)初学者声明函数的步骤
a.确定函数功能
b.确定函数功能确定函数名
c.确定函数的参数:看实现函数的功能需不需要从外面传值,需要几个?
d.实现函数的功能
注意(重要!!!):声明函数的时候不会执行函数体
4.函数的调用 (调用函数相当于使用机器)
1)语法
函数名(实参列表)
2)说明
- 函数名 - 必须是已经声明过的函数的函数名
- () - 固定写法
- 实参列表 - 以'值1,值2,值3...'形式存在:这儿的每个值就叫实参,
实参是用来给形参赋值的
注意:同一个函数可以调用多次
练习:要求写一个函数,实现两个数的和并且打印
def two_sum(num1=34, num2=3):
"""
函数功能说明部分 : 求和
:param num1: 参数num1的说明部分
:param num2: 参数num2的说明部分
:return: 返回值说明
"""
print(num1 + num2)
two_sum(45,23)
函数的调用
1.函数调用过程
1)语法
函数名(实参列表)
2)调用函数的作用: 执行函数体;获取返回值
3)函数的调用过程:
第一步: 回到函数声明的位置
第二步: 传参(用实参给形参赋值)
第三步: 执行函数体
第四步: 执行完函数体就确定返回值
第五步: 回到函数调用的位置接着往后执行
练习:声明一个函数,实现求1+2+3+...n的和
def sum_n(n):
sum1 = 0
for x in range(1,n-1):
sum1 += x
return sum1
print(sum_n(10))
练习:声明一个函数,打印字符串中所有的字母字符
def alpha(str1):
new_str = ''
for char in str1:
if 'A'<=char<='Z' or 'a'<=char<='z':
new_str += char
return new_str
print(alpha('dno373ds9'))
练习: 声明一个函数,在指定字符串中的数字字符后添加一个指定的字符
def add_num(str1,x):
new_str = ''
for char in str1:
if '0'<=char<='9':
new_str += char + x
else:
new_str += char
return new_str
print(add_num('r2g3s3y3s','*'))
函数的参数
1.位置参数和关键字参数
根据调用函数的时候传参的方式将参数分为位置参数和关键字参数
- 位置参数:让实参和形参在位置上一一对应(第一个实参给第一个形参赋值,第二个实参给第二个形参赋值...)
- 关键字参数:以'形参名=值'的形式传参
注意:位置参数和关键字参数可以同时使用,但是一起用的时候要求位置参数必须在关键字参数的前面 - 什么时候使用关键字参数:需要跳过前面某个或者某几个参数,直接给后面某个参数赋值的时候必须使用关键字参数。
2.参数默认值
- 声明函数的时候,形参可以设置默认值。设置完默认值后调用函数的时候有默认值的参数可以不用传参。
- 一个函数可以给所有的参数设置默认值,也可以给部分参数设置默认值;必须保证没有默认值参数必须放在有默认值参数的前面
3.参数类型说明
- 给参数赋默认值,默认值的类型就是参数的类型
- 以'参数名:类型名'的形式声明函数
def func1(a,b=200,c=300):
print('a:{},b:{},c:{}'.format(a,b,c))
# 位置参数传参
func1(10,20,30) # a:10,b:20,c:30
# 关键字参数传参
func1(b=20,c=30,a=10) # a:10,b:20,c:30
# 位置参数和关键字参数可以同时使用,但位置参数必须在前面
func1(10,c=30,b=20) # a:10,b:20,c:30
# 有默认值的可以不用传参
func1(10) # a:10,b:200,c:300
func1(10,20) # a:10,b:20,c:300
func1(10,c=30) # a:10,b:200,c:30
4.不定长参数
-
在形参的前面加*,那么这个参数据可以同时接收多个实参,
注意:- 带*的参数会作为一个元祖,对应的多个实参是元祖中的元素;
- 带*的不定长参数,不能使用关键字参数传参
-
在形参前加,那么这个参数也可以同时接收多个实参(关键字参数,关键字自己随便命名);
将带的参数作为一个字典,将关键字参数的关键字作为key实参作为value存储在字典中。
练习:写一个函数,计算多个数的和
def sum1(x,y,*num): #这里的num是一个元祖
print(x,y,num) # 12 2 (345, 6, 3, 2)
print(sum(num))
sum1(12,2,345,6,3,2) #带*的不定长参数,不能使用关键字参数传参
def sum2(**nums): # 这里的nums是一个字典
print(nums) # {'b': 2, 'c': 345, 'd': 6, 'e': 3, 'f': 2}
sum2(b=2,c=345,d=6,e=3,f=2) # 带**的不定长参数,只能使用关键字参数传参
def func2(*args,**kwargs):
print(args,kwargs)
func2(2,3) # (2, 3) {}
func2(a=1,b=3) # () {'a': 1, 'b': 3}
func2(2,3,a=3,b=4) # (2, 3) {'a': 3, 'b': 4}
补充:*的用法
1 *用在序列中用来解包(粉碎容器,只保留元素)
2 **只能用于解包字典,但是单独使用不行,因为键值对无法独立存在
3 通常与自定义函数结合使用,将某序列解包传参给自定义函数
list1 = [1,2,3,4,5,6,7]
print(*list1) # 1 2 3 4 5 6 7
print(*'lsdfoi') # l s d f o i
print(*{1,2,3,5,7}) # 1 2 3 5 7
print(*{'a':1,'b':2}) # a b
练习:声明一个函数求多个数的差
def differ(*nums):
if nums:
print(nums[0]-sum(nums[1:]))
else:
print(0)
differ(12, 23, 34, 45, 67)
differ(12, 23, 34, 45, 67) # -157
differ(*[12, 23, 34, 45, 67]) # -157
函数的返回值
1.什么是返回值
- 返回值就是return关键字后表达式的值(怎么确定函数的返回值)
- 返回值就是函数调用表达式的值(怎么获取函数的返回值)
(python中所有的函数都有返回值,默认为None)
- 什么是return
return是函数体中的关键字(只能在函数中使用),作用有两个:结束函数/确定函数返回值
a. 结束函数:执行函数体的时候只要遇到return,函数直接结束
b. 确定函数返回值: return 返回值(可以是具体的数据,声明过的变量,运算表达式)
2)什么是函数调用表达式
函数调用语句就是函数调用表达式。例如:func1(10) max([1,2,3,4,5,6]),
每个调用函数的语句都有结果,这个结果就是调用这个函数得到的返回值
2.怎么使用返回值
想要用函数的返回值,就使用函数调用表达式的值.
普通数据能做的事情,函数调用表达式都可以做
3.什么时候需要返回值
初学者: 看实现函数的功能会不会产生新的数据,有就返回
return 返回值1,返回值2,...
def sum1(num1,num2):
return num1+num2 # return 可以保存
a=sum1(10,20)
print(a)