Python基础学习——函数

1.函数的定义与调用

def name():  #定义
    ……

name()  #调用

2.默认参数、位置参数、关键字参数

        默认参数:即缺省参数,若没有可传递的实参,这些形参会自动使用默认值。

def Studentinfo(name,country='中国'):
#country为默认参数

        位置参数:通过位置体现实参与形参的对应。

        关键字参数:形式为“形参=实参”。

def Studentinfo(name,how='良好',counrty='中国'):
    ……    


Studentinfo(name='约翰','一般','美国')
#第一个为关键字参数,后两个为位置参数

3.不定长参数

        定义:在函数调用时可以接受任意数量的形参。以元组(位置参数)或字典(关键字参数)的形式。

def name(*不定长参数名):  #位置参数

或

def name(**不定长参数名):  #关键字参数

        此时若输出实参信息,也会以元组或字典的形式输出相关参数。

4.拆分参数列表

        若一个函数所需要的参数已经存储在列表、元组或字典中,可将其拆分出来作为函数的参数。其中列表、元组拆出位置参数,字典拆出关键字参数。

def Sum(*args):
    ……

ls=[1,3,5,7]  #列表
Sum(*ls)
def Studentinfo(name,how,country):
    ……

d={'country':'中国','how':'良好','name':'小明'} #字典
Studentinfo(**d)

5.import语句和from...import

import mod1

        导入模块后,若要使用模块中定义的标识符,需要通过“模块名.标识符名”的方式。

from 模块名 import 标识符 

#还可以起别名
import A as B

6.全局变量_name_和系统模块

        _name_作用:获取当前模块的名称,若当前模块单独运行,则其值为_main_;否则为模块的名字。

        可以直接导入系统提供的模块,使用其功能。

7.包

        包:可看作时操作系统中的文件夹。

        定义:创建一个文件夹,并在此文件夹下创建一个_init_.py文件,文件夹的名字就是包名;若想创建子包,则在该文件夹下再创建一个子文件夹,子文件夹中再创建一个_init_.py文件,则可形成子包。

        plus:模块可以放在包或子包中,此时在导入模块时需要说明包的名字。

8.全局变量和global函数

        global:可以声明在该函数中使用的时全局变量,而非局部变量。

        plus:在一个函数中要修改全局变量的值,必须使用global关键字声明使用的为全局变量。

def text():
    global x   #声明x为全局变量
    x=100

9.nonlocal

        作用:可以使内层函数直接使用外层函数中定义的变量。

不使用时:

def outer():
    x=10
    def inner():
        x=20

#此时inner中的x为20,outer中的x为10

使用时:

def outer():
    x=10
    def inner():
        nonlocal x=20

#此时两个函数中的x均为20

10.递归函数

        emmm,汉诺塔Q^Q

问题阐述:汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则:

  • 每次只能移动柱子最顶端的一个圆盘;
  • 每个柱子上,小圆盘永远要位于大圆盘之上;

解决汉诺塔问题是有规律可循的:
1)当起始柱上只有 1 个圆盘时,我们可以很轻易地将它移动到目标柱上;

2) 当起始柱上有 2 个圆盘时,移动过程如下图所示:

 核心:先将起始柱上的 1 个圆盘移动到辅助柱上,然后将起始柱上遗留的圆盘移动到目标柱上,最后将辅助柱上的圆盘移动到目标柱上。

3) 当起始柱上有 3 个圆盘时,移动过程如图 2 所示,仔细观察会发现,移动过程和 2 个圆盘的情况类似:先将起始柱上的 2 个圆盘移动到辅助柱上,然后将起始柱上遗留的圆盘移动到目标柱上,最后将辅助柱上的圆盘移动到目标柱上。

通过分析以上 3 种情况的移动思路,可以总结出一个规律:对于 n 个圆盘的汉诺塔问题,移动圆盘的过程是:

  1. 将起始柱上的 n-1 个圆盘移动到辅助柱上;
  2. 将起始柱上遗留的 1 个圆盘移动到目标柱上;
  3. 将辅助柱上的所有圆盘移动到目标柱上。


由此,n 个圆盘的汉诺塔问题就简化成了 n-1 个圆盘的汉诺塔问题。按照同样的思路,n-1 个圆盘的汉诺塔问题还可以继续简化,直至简化为移动 3 个甚至更少圆盘的汉诺塔问题。

// num 表示移动圆盘的数量,source、target、auxiliary 分别表示起始柱、目标柱和辅助柱
hanoi(num , source , target , auxiliary): 
    if num == 1:     // 如果圆盘数量仅有 1 个,则直接从起始柱移动到目标柱
        print(从 source 移动到 target)
    else:
        // 递归调用 hanoi 函数,将 num-1 个圆盘从起始柱移动到辅助柱上,整个过程的实现可以借助目标柱
        hanoi(num-1 , source , auxiliary , target)
        // 将起始柱上剩余的最后一个大圆盘移动到目标柱上
        print(从 source 移动到 target) 
        // 递归调用 hanoi 函数,将辅助柱上的 num-1 圆盘移动到目标柱上,整个过程的实现可以借助起始柱               
        hanoi(n-1 , auxiliary , target , source)

以上内容来自:汉诺塔问题(分治+源码+动画演示) (biancheng.net)

另附一视频链接方便理解:递归,汉诺塔,最全面的讲解,没有之一_哔哩哔哩_bilibili

11.高阶函数和lambda函数

        高阶函数:把函数作为参数的一种函数。

def add(f,x,y):
    return f(x)+f(y)


#其中f为函数名

        plus:函数不仅可以赋给形参,还可以赋给普通变量。赋值后,即可用变量名代替函数名完成函数调用。

        lambda函数:又称匿名函数,是一种不使用def定义函数的形式,其作用是快速定义一个简短的函数。

lambda [a,b,c,d]:表达式

#表达式的计算结果即为该函数的返回值。

lambda x:x**2
#此时返回值为x的平方

12.闭包

        定义:如果内层函数使用了外层函数中定义的局部变量,并且外层函数的返回值是内层函数的引用,则构成了闭包。(定义在外层函数中但由内层函数使用的变量被成为自由变量)闭包是一种特殊情况,外层函数在结束时会发现其定义的局部变量将来会在内层函数中使用,此时外层函数就会把这些自由变量绑定到内层函数中。所谓闭包,实际上就是将内层函数的代码以及自由变量打包在一起。

def outer(x):
    y=10
    def inner(z):
        nonlocal x,y
        retrun x+y+z    
    return inner

f=outer(5)
g=outer(50)
#f,g为返回的innner函数 f(20)为5+10+20=35

留个坑,闭包知识还有很多,有待完善……

13.装饰器

        作用:可以在不修改已有函数的情况下为已有函数注入新的代码。

@deco 1 #已经写好的函数作为装饰器
def f1(a,b):
    ……

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值