Python函数
一 快速入门
函数是为实现某种功能的一段代码
函数可为分为4种:
- 内置函数,不用导入(import)可直接使用的,如print, list,len等
- 标准库函数,官方已收录,需导入,有time,os等库
- 第三方库函数,官方未收录,需导入,有pygame, openpyxl等库
- 自定义函数,自己写的
在python中函数定义格式如下:
较简洁
def 函数名称():
	函数体
def info():
    print("my name is chao")
    print("my age : 36")
更完整
def 函数名称(参数1,参数2):
	函数体
    return 0
def jia(a, b):
    c = 0
    c = a + b
    return c
t = jia( 10, 30)
print( f"结果为: {t}")
函数可以有返回结果的,关键字为return 结果
有返回值的样例(定义与调用)
# 函数定义
def info():
    print("-"*10)
    print("我的姓名:","袁超")
    print("我的年龄:",36)
    print("我的地址:","湘江工贸")
    print("-"*10)
    return 0
    
# 函数调用
info()
有返回值的样例(定义与调用)
# 函数定义
def getName():
    return "袁超"
# 函数调用 
n = getName()
print( n )
函数在程序设计中有不限于以下几个明显作用:
- 函数可以提高代码复用性,降低代码冗余
- 函数可以让代码结构更加清晰
注意执行流程问题
问题1:函数作用范围
问题2:函数调用才是执行
print("1")
# 函数定义
def aa():
    print("2")
    print("3")
    print("4")
    
print("5") 
info() # 函数调用
print("6") 
运行结果为:
1
5
2
3
4
6
练习案例定义一个函数,用于输出天气综合信息
# 函数定义
def weater( ):
    print("-" * 10)
    print("日期:","2023-02-20")
    print("温度:","12~23摄氏度")
    print("空气","良好")
    print("-" * 10)
# 函数调用
weater(  )
二 关于参数
函数可设计参数的传入,使得函数功能更灵活、更强大
def info():
    print("英雄名称:", "张飞")
    print("英雄类别:", "辅助")
    print("英雄来源:", "王者荣耀")
info( )
以上是一个用来输出英雄综合信息的函数,但是功能是单一的,是固定的
添加参数,更新此函数,让函数的功能更加的灵活,强大
# 定义函数,且设定"形参"
def info( a, b, c):   
    print("英雄名称:", a)
    print("英雄类别:", b)
    print("英雄来源:",  c)
# 函数调用,并传入具体的参数(根据函数的定义来传,这里叫实参,且这种方式我们称为 位置参数传递)
info( "项羽", "坦克", "王者荣耀" )
info( "安琪拉", "法师", "王者荣耀" )
以上代码运行结果:
英雄名称:项羽
英雄类别:坦克
英雄来源:王者荣耀
英雄名称:安琪拉
英雄类别:法师
英雄来源:王者荣耀
此处讲解的只是位置参数,也就是按位置进行参数传递
练习
定义一个函数,用于输出天气综合信息
三 内置函数
Python内置了一些实现特定功能的函数,这些函数已被官方收录,可直接使用,常用的基础功能性函数如下:
abs( )	返回绝对值函数
len()	返回序列对象(列表,元组,字符串等)的长度
eval()	返回字符串表达式的值
ord()	返回字符对应的Unicode编码(如:A是65, a是97)
chr()	与ord()相反
使用案例:
t = abc(-99)
print(f"t的结果为:{t}")
运行结果:
t的结果为99
strs = "王者荣耀"
tmp = len(strs)
print(f"文本:{strs} 的长度为:{tmp}")
运行结果:
文本:王者荣耀 的长度为:4
strs = "100 + 199"
tmp = eval(strs)
print(f"字符串表达式:{strs} 的计算结果为:{tmp}")
运行结果:
字符串表达式:100 + 199 的计算结果为:299
str = 'A'
d = ord(str)
print(f"{d} 的Unicode编码为:{d}")
运行结果:
A 的Unicode编码为:65
课堂练习: 完成 len()函数, eval()函数的案例练习
四 参数传递
函数的参数传递是指将实际数据传递给函数形参的过程,根据不同的传递方式,函数的参数可分为位置参数、关键字参数、默认参数、不定长参数4种。
1 位置参数
按函数参数对应位置进行传递
def info( name, typ, address):
    print(f"英雄名称:{name}")
    print(f"英雄类别:{typ} 类英雄")
    print(f"英雄来源:{address} 游戏")
# 函数调用,并传入具体的参数(根据函数的定义来传)
info( "项羽", "坦克", "王者荣耀" )
info( "安琪拉", "法师", "王者荣耀" )
2 关键字参数
函数参数较多时,不想记对应位置的话,可以按 形式参数名 = 实际数据,进行传递
# 函数定义
def info( name, typ, address):
    print(f"英雄名称:{name}")
    print(f"英雄类别:{typ} 类英雄")
    print(f"英雄来源:{address} 游戏")
    
# 函数调用 ,且传递参数
info( address="英雄联盟", name="盖伦", typ="上单")
info( name="亚瑟", typ="对抗路", address="王者荣耀")
运行结果:
------------------------------
英雄名称:盖伦
英雄类别:上单
英雄来源:英雄联盟
英雄名称:亚瑟
英雄类别:对抗路
英雄来源:王者荣耀
3 默认参数
定义函数时,可以指定形参的默认值,在调用函数时,如没有传递数据,函数则按默认值处理,如有传递数据,则覆盖默认值。
# 函数定义, 且部分参数有默认值
def info( name, typ, address="王者荣耀"):
    print(f"英雄名称:{name}")
    print(f"英雄类别:{typ}")
    print(f"英雄来源:{address}")
# 函数调用 ,且传递参数
info( "亚瑟", "对抗路" )
info( typ="上单",  name="盖伦" ,address="英雄联盟")
运行结果:
------------------------------
英雄名称:亚瑟
英雄类别:对抗路
英雄来源:王者荣耀
英雄名称:盖伦
英雄类别:上单
英雄来源:英雄联盟
课堂练习: 完成以上关键字参数传递的函数定义和调用
4 可变参考,也叫不定长参数
若要传入函数中的参数个数是不确定的,可以使用不定长参数(也称可变参数),可变参数有其特定的写法,内部由元组和字典来存储数据,语法格式如下:
def 函数名(*args, **kwargs):
    函数体
以上语法格式中的参数*ages和**kwargs都是不定长参数,可依情况单独或搭配使用。
*ages 接收不定数量的可变参数,以元组形式保存
**kwargs接收不定数量的可变参数,以字典形式保存
测试案例1
def test(*args):
    print( args )
    print( args[3] )
test(100,200,300,"Hello","Python")
运行结果:
(100,200,300,"Hello","Python")
Python
测试案例2
def test(**kwargs):
    print( kwargs )
test(a=10, b=20, c=30)
运行结果:
{'c':30, 'a':10, 'b':20}
五 变量作用域
变量的作用域指的是变量的作用范围,Python中变量分为局部变量与全局变量。
局部变量
定义在函数内部的变量是局部变量,此种变量只在函数内有效
def test():
    name = 'python'
    print( name )
test()
print( name )
运行结果:
python
报错 NameErro 'name' is not defined
全局变量
定义在函数外面的变量是全局变量,此种变量在当前程序中都能使用
count = 0
def test():
    count += 1
    print( count )
test()
print( count )
运行结果:
1
1
六 扩展与提高
6.1 匿名函数
匿名函数的函数体只能是单个表达式。匿名函数一般用来实现一些单一的功能,这种函数没有函数名称,一般用一个变量去保存它,再去使用。也称lambda表达式。
语法格式:
lambda 参数1,参数2 : 函数体(只能是单个表达式)
案例:
# 定义
sum = lambda data1, data2 : data1+data2
# 使用
sum(100,200)
运行结果:
300
6.2 递归函数
递归函数指的是函数会直接或间接的调用自己的一种函数。
阶乘
5*4*3*2*1
def factorial(num):
    if num == 1:
        return 1
    else:
        return num * factorial(num - 1)
斐波拉切数列
1  1  2   3  5  8   13  21   34  .....
def fblq(n):
    if n == 1 || n == 2:
        return 1;
    else:
        return fblq(n-2) + fblq(n-1);
七 练习题
一. 填空
- 
Python中使用关键字( )声明一个函数。 
- 
Python中使用 关键字( )返回函数结果。 
- 
可以用来返回序列对象长度的内置函数是( )。 
- 
阅读以下程序, 运行结果为( ) num_one = 12 def sum(num_two): num_one = 90; return num_one + num_two; print( sum(10) )
- 
阅读以下程序, 运行结果为( ) def many_param(num_one, num_two, *args): print( args ); many_param( 11,22,33,44,55 )
- 
阅读以下程序, 运行结果为( ) def fact(num): if num == 1: return 1 else: return num + fact(num - 1); print(fact(5))
二. 判断
- 函数可以提高 代码的复用性。 ( )
- Python中函数的位置参数传递有严格的位置关系。 ( )
- 函数执行结束后,其内部的局部变量会被回收。( )
三. 编程题
- 
编写函数,输出1~100之间的数,调用运行。 # 定义 def print_number(): pass # 调用 print_number();
- 
编写函数,输出n~m之间的数(包括n,不包括m),调用运行。 
- 
编写函数,用于获取指定分数的等级,调用运行。 60以下为不合格,60以上为合格,80以上为良好,90以上为优秀 def getLevel(score): return "" level_txt = getLevel(78); print( level_txt ) level_txt = getLevel(56); print( level_txt )
- 
编写函数,计算 20 * 19 * 18 * 17 * ... * 3的结果
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号