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);

七 练习题

一. 填空

  1. Python中使用关键字( )声明一个函数。

  2. Python中使用 关键字( )返回函数结果。

  3. 可以用来返回序列对象长度的内置函数是( )。

  4. 阅读以下程序, 运行结果为( )

    num_one = 12
    def sum(num_two):
        num_one = 90;
        return num_one + num_two;
    print( sum(10) )
    
  5. 阅读以下程序, 运行结果为( )

    def many_param(num_one, num_two, *args):
        print( args );
    many_param( 11,22,33,44,55 )
    
  6. 阅读以下程序, 运行结果为( )

    def fact(num):
        if num == 1:
            return 1
        else:
            return num + fact(num - 1);
    print(fact(5))
    

二. 判断

  1. 函数可以提高 代码的复用性。 ( )
  2. Python中函数的位置参数传递有严格的位置关系。 ( )
  3. 函数执行结束后,其内部的局部变量会被回收。( )

三. 编程题

  1. 编写函数,输出1~100之间的数,调用运行。

    # 定义
    def print_number():
        pass
    
    # 调用
    print_number();
    
  2. 编写函数,输出n~m之间的数(包括n,不包括m),调用运行。

  3. 编写函数,用于获取指定分数的等级,调用运行。

    60以下为不合格,60以上为合格,80以上为良好,90以上为优秀

    def getLevel(score):
        return ""
    
    level_txt = getLevel(78);
    print( level_txt )
    
    level_txt = getLevel(56);
    print( level_txt )
    
  4. 编写函数,计算20 * 19 * 18 * 17 * ... * 3的结果

posted @ 2023-02-20 22:28  yuansir0731  阅读(102)  评论(0)    收藏  举报