python学习笔记——第二章 函数(我把所有python笔记做了顺序上的调整和总结,希望可以便于你们阅读)

2.函数

介绍:在写代码时经常会有一些比较复杂的情况,这时候使用一些函数会使部分代码变的简洁

2.01函数的定义与使用

函数的定义:函数的输入、输出和数据处理所需要的函数代码的编写。(定义只是编写了这个函数会进行什么操作,但是并不会执行它)

函数的调用:真正的执行代码。根据传入的数据完成运算,并返回结果到函数调用位置

一个简单的定义函数的例子

 2.02形参和实参

形参:即为形式参数。在定义函数时函数后面小括号里的参数列表的参数。

形参只能在函数中使用,它只是用来接收函数传入的参数值并作为参与运算的一部分

def calculate(r):
    s=2*r*3.14

如代码中的 r 即为形参

实参:即为实际参数。在调用函数时函数名后面的一对小括号中给出的参数列表

调用函数中将实参的值传递给形参,函数中再利用其做运算。

注意:当实参传递给形参后,如果在函数体中对形参值改变,那修改并不会影响实参,即实参值不会改变。

但当实参是列表对象时,就可以改变实参列表里的值。

1--8行代码演示的为实参值不能改变。

9--14行代码演示的为列表的改变。

可以看到不能将实参和形参进行交换或者赋值 值。

 2.03默认参数和关键字参数

函数的默认参数即为缺省参数,即当调用参数时,如果没有为某些参数传递对应的参数,那么函数就会自动使用默认参数值。

​

def StudentInfo(name, chineselevel='良好', country='中国'):
    # 注意:这里去掉了引号,因为chineselevel和country是变量,不是字符串
    print('姓名:%s,中文水平:%s,国家:%s' % (name, chineselevel, country))

# 正确的调用方式
StudentInfo('李晓明')#输出  姓名:李晓明,中文水平:良好,国家:中国
StudentInfo('大卫', '美国')  # 注意:这里chineselevel需要加引号
StudentInfo('美国', '一般', '约翰')  # 注意:这里chineselevel和name需要加引号

在调用函数时还可以用关键字参数来传递数据,其形式为“形参=实参”。

def StudentInfo(name, chineselevel='良好', country='中国'):
    # 注意:这里去掉了引号,因为chineselevel和country是变量,不是字符串
    print('姓名:%s,中文水平:%s,国家:%s' % (name, chineselevel, country))

# 正确的调用方式
StudentInfo('李晓明')
StudentInfo('约翰',country='美国')  # 注意:这里chineselevel和name需要加引号

关键字参数和位置参数可以混合使用,但是要注意位置参数必须在前、关键字参数在后

 2.04不定长参数

不定长参数,即在调用函数时可以接收任意数量的实参,这些实参在传递给函数时会被封装成元组(位置参数)或字典(关键字参数)形式。

一般情况下,不定长参数是放在形参列表的最后,前面传入的实参与普通形参一一对应,而后面剩余的实参会被封装成元组或字典后传给不定长参数。

对于使用位置参数形式的不定长参数,Python也允许普通形参放在不定长参数后面,但此时要求在调用函数时必须使用关键字参数方式给不定长参数后面的形参传递实参。

对于有默认参数的形参,在调用函数时也可以不传入相应实参。

带不定长函数的定义方法如下:

def函数名([普通形参列表,]*不定长参数名[,普通形参列表]):
        函数体

def函数名([普通形参列表],**不定长参数名):
        函数体
*不定长参数名” 表示这个不定长参数对应的是一组位置参数
**不定长参数名” 表示这个不定长参数对应的是一组关键字参数

def StudentInfol1(name,*args):#定义函数Studentlnfol
    print('姓名:',name,',其他:',args)
def StudentInfol2(name,**args):#定义函数Studentlnfol
    print('姓名:',name,',其他:',args)
def  Studentlnfo3(name,*args,country='中国'):#定义函数Studentlnfo3
    print('姓名:',name,',国家:',countny,',其他:'args)

调用函数实例如下:

StudentInfo1('李晓明','良好','中国')
StudentInfo2('李晓明',中文水平='良好',国家='中国')
StudentInfo3('李晓明',19,'良好')
StudentInfo3('大卫',19,'良好',country='美国')

 输出为:

姓名: 李晓明 ,其他: ('良好', '中国')
姓名: 李晓明 ,其他: {'中文水平': '良好', '国家': '中国'}
姓名: 李晓明 ,国家: 中国 ,其他: (19, '良好')
姓名: 大卫 ,国家: 美国 ,其他: (19, '良好')

 2.05拆分参数列表

如果所需要的参数已经在一个元组、字典或者列表之中,则可以直接从中拆分出来这些参数

其中列表、元组拆分出来的结果作为位置参数, 而字典拆分出来的结果作为关键字参数

 2.06返回值

函数的返回值用于参与代码其他地方的运算。

实例代码:

 除了返回个别数值之外,函数还可以返回字符串、列表、元组等数据

只需要将返回值用字符串、列表、元组的方式输出即可

此外,如果输出多个数值,函数会自动将其组装成一个元组返回。

返回值也可以返回布尔值,只需要在结尾输出一个逻辑判断,即可。

 2.06模块概述和import语句

模块概述

Python提供了交互式脚本式两种运行方式。当要执行的代码比较长且需要重复使用时,我们通常将代码放在扩展名为.py的Python脚本文件中。

当我们要编写一个规模比较大的程序时,如果将所有代码都放在一个脚本文件中,则不方便维护和多人协同开发。

对于可以在多个程序中重用的功能,我们也最好将其放在单独的脚本文件中,以方便多个程序通过引用该脚本文件、共享这些功能。

此时,我们需要按照代码功能的不同,将代码分门别类地放在不同的脚本文件中,这些脚本文件就称为是模块(Module)。

import语句:

当需要使用模块时,;可以使用import语句导入。

如在模块A中引入模块B后,可以在模块A使用B的变量和函数(直接输入脚本名字即可,脚本会自动寻找)

格式:

import module1

import module2

.......

import module1,module2,module3

导入后注意:

1.导入模块后,如果要使用导入的函数必须要通过“模块名.标识符名”的方式

2.如果导入模块中有除了函数以外的语句,那么这些语句也会执行,如print之类的

2.07包

包的概述:

Python中的包(Package)的作用与操作系统中文件夹的作用相似,利用包可以将多个关系密切的模块组成在一起,一方面方便进行各脚本文件的管理,另一方面可以有效避免模块命名冲突问题

定义一个包,就是创建一个文件夹并在该文件夹下创建一个_init_.py文件,文件夹的名字就是包名。

另外,可以根据需要在该文件夹下再创建子文件夹,子文件夹中创建_init_.py文件,则又形成了一个子包。

注意:_init_.py可以是一个空文件,也可以包含包的初始代码或者设置_all_列表。

其中_init_.py就是初始化配置。_all_列表存储的是当前模块中一些成员(变量、函数或者类)的名称

使用格式:

模块可以放在任何一个包或子包中,在导入模块时需要指定所在的包和子包的名字。例如,如果要导入包A中的模块B,则需要使用"import A.B"。如果有更长的路径则以此类推。

例如,如果想引入wavread这个包,则引用格式为

import sound.formats.wavread

如果想引入某个包中的函数,则引用格式为

import sound.echo.echofilter(实参列表)

此外一些比较简洁的写法:

 2.08.猴子补丁和第三方模块

猴子补丁概述:

猴子补丁是指在运行时动态替换已有的代码,而不需要修改原始代码。

猴子补丁主要用于在不修改已有代码情况下修改其功能或增加新功能的支持。

在使用第三方模块时,模块中的某些方法可能无法满足我们的开发需求。此时,我们可以在不修改这些方法代码的情况下,通过猴子补丁用一些自己编写的新方法进行替代,从而实现一些新的功能。

如原代码为:

def sum(*args):
    base=0
    for i in args:
        base += i
    return base

这时如果想改变代码功能,则可以:

def newsum(*arg):
    base=0
    for i in raange(1,arg+1):
        base+=i
    return base
sun=newsum

将新的函数赋给旧函数即可

第三方模块概述:

当我们想给代码增添一些额外功能,可以选择使用第三方模块

引用方式:

安装方式有很多,这里以安装numpy模块通过pip工具为例:

Windows+R键 ,输入cmd,打开DOS命令界面,输入pip install sympy回车,等待安装即可

当然这样可能会比较慢,有时可以查找国内的镜像网站来下载。

与上输入相同当时最后输入时为

pip install numpy -i 网站地址

 2.08.变量的作用及global关键字

变量的分类:

全局变量:在函数外定义的变量即为全局变量,在所有函数中都可以使用。

局部变量:在一个函数中定义的变量就是局部变量(包括形参),作用范围是从定义变量位置至函数结束位置。

global关键字:

在函数中如果想使用全局变量可以使用global,以声明使用的是全局变量

使用格式:

global 变量名

2.09.nonloocal关键字

概述:

在python中,函数可以嵌套,在一个函数再定义一个函数。

通过nonloacal关键字,可以使内层函数使用外层函数的变量。

格式:

nonlocal 变量名

2.09.递归函数

概述:

递归函数是指在一个函数内部通过调用自己来完成一个问题的求解。

当我们在进行问题分解时,发现分解之后待解决的子问题与原问题有着相同的特性和解法,只是在问题规模上与原问题相比有所减小,此时就可以设计递归函数进行求解。

例子:

对于计算n!的问题,可以将其分解为:n!=n*(n-1)!。可见,分解后的子问题(n-1)!与原问题n!的计算方法完全一样,只是规模有所减小。同样,(n-1)!这个子问题又可以进一步分解为(n-1)*(n-2)!,(n-2)!可以进一步分解为(n-2)*(n-3)!..,直到要计算1时,直接返回1。

代码为:

def plus(a):
    if a==1:
        return 1
    return a*plus(a-1)
print(plus(10))

注意:

1.当问题所使用数值比较大时,会涉及多次递归而占用栈,从而影响运行速度

2.栈的太多堆叠会导致出错,最高为1000层

2.09.高阶函数及lambda函数

概述:是指把函数作为参数的一种函数

语法格式:

def function(f,a,b):

        return f(a)+f(b)

f为传入的函数,a  b为传入的参数

例子:

def funadd(f,a,b):
        return f(a)+f(b)
def square(a):
        a=a**2
def cube(a):
        a=a**3

  注意:函数也可以赋给形参,普通变量。赋值后可以用变量来完成函数调用。

lambda函数概述:

lambda函数也为称为函数,是一种不用def定义的函数,用来快速定义一个简短函数

格式:

lambda 变量名:计算式

这个函数定义式可以当作一个变量来用,也可以将其赋值给一个变量,再当作函数来用。

2.10 闭包

概述:

如果内层函数使用了外层函数的局部变量,并且外层函数的返回值是内层函数的引用。

定义在外层函数但由内层函数使用的变量称为自由变量。

一般来说,自由变量在外层函数结束时会释放,但是在闭包情况下会保留自由变量,并且绑定到内层函数中

或者说,闭包即为将内层函数的代码以及自由变量打包在一起。

实例:

def plus(a):
    b=10
    def inner(c):
        nonlocal a,b
        return a+b+c
    return inner

这时引用这个函数就会出现闭包情况

引用方式为:

f=plus(10)

F=f(20)

或者

plus(10)(20)

2.11 装饰器

概述:

装饰器可以使得原函数具备新的功能,而且不改变原有函数的代码

一个装饰器可以给多个函数使用,一个函数也可以使用多个装饰器

实例:

这里定义的是一个装饰器

def deco1(func):#定义函数
    def inner1(*args,**kwargs):#定义函
        print('deco1 begin')
        func(*args,**kwargs)
        print('decol end')

这里是一个函数使用装饰器

@deco1
def fl(a,b):
    print('a+b=',a+b)
f1(3,5)
#输出deco1 begin
#a+b=8
#decol end

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值