Python学习总结【连载】(九)

Python学习总结【连载】(九)

2018.06.23 Juttachen


概述

+ 28 函数变量

  • 函数名
  • 为其他变量赋值
  • 作为参数
  • 作为返回值

+ 29 匿名函数

  • 格式

+ 30 递归函数

  • 定义
  • 作用
  • 步骤
  • 函数的调用过程

+ 31 模块与函数

  • 模块的类型

二十八、函数变量

我们在声明函数的时候,其实就是在声明一个类型是函数类型(function)的变量。
普通变量能做的事情,函数变量都能做。

1.函数名就是函数类型变量(类型名:function),存的是函数入口的地址。

    def func1():
        print('aaa')

    print(type(func1))
    num = 10
    print(type(num))

2.可以用一个变量给另外一个变量赋值

注意:a = func1() #这样赋值,是将func1的返回值赋给a

    a = func1 #将函数变量func1赋给a,a就会变成一个函数
    a() #现在就可以用函数变量a,去调用函数func1

他们指向同一个地址,所以运行方式一样。

3.函数变量作为函数的参数

    def calculate(num1,num2,func1):
        '''num1 = 10 num2 =20 fn=func_add'''
        '''如果num1不是int 或者float数据'''
        if not(isinstance(num1,int) or isinstance(num1,float)):
            print('num1不是数字')
        if not(isinstance(num2,int) or isinstance(num2,float)):
            print('num2不是数字')
            return None
            return func1(num1,num2)

    def func_add(m,n):
        return m+n

    def fumc_sub(m,n):
        return m-n


    func2(10)
    result = calculate(10,20,func_add)
    print(result)

4.函数作为返回值

例子:写一个函数,func2('+') -> 返回求和的功能;如果是('')——>返回求乘积的功能*

    def func2(char):
        if char == '+':
            def func2_add(*nums):
                sum1 = 0
                for x in nums:
                    sum1 += x
                return sum1
            return func2_add
        if char =='*':
            def func2_product(*nums):
                pro1 = 1
                for x in nums:
                    pro1 += x
                return pro1
            return func2_product

    result = func2('+') # result是一个求和功能的函数的函数变量
    print('aaa',result(1,2,3,4))

    result2 = func2('*')(10,20)
    print(result2)

    def func4():
        list1 = [1,2,3]
        return list1

    # 列表作为返回(对象变量作为返回值)
    result = func4()
    print(result)
    print(func4()[0])

二十九、匿名函数

python 中使用lambda关键字来声明一个匿名函数

1.格式

lambda 参数列表:返回值
参数列表:多个参数之间用逗号隔开
例子:使用普通函数实现求两个数的和

    def func1(num1,num2):
        return num1 + num2
    func1(10,20)

    # 使用匿名函数实现
    func2 = lambda num1,num2 : num1 + num2
    func2(10,20)

相当于匿名函数就是可以替代函数体里只有return或者只有一句命令的函数。
练习:使用匿名函数求指定列表中,指定的两个下标对应的元素的和

    list1 = [1,2,3,4]
    func3 = lambda list1,num1,num2 : list1[num1]+list1[num2]
    print(func3(list1,0,3))

    def calculate(num1,num2,fn):
        return fn(num1,num2)

    sum1 = calculate(10,20,lambda a,b:a+b)
    print(sum1)

三十、递归函数

1.定义

在函数的声明中调用函数本身就是递归函数。
例子:这里的func1就是一个递归函数,但是是一个死循环
def func1()
print('aaa')
func1()
func1()

2.递归作用

理论上循环能够做到的事情递归都可以做(但实际除非是非用不可的情况一般不用递归)原因:要调动函数,调动函数需要内存空间,还需要销毁,消耗空间且运行麻烦,损耗cpu

3.步骤:

a.确定临界值(结束函数的时刻)
b.假设函数的功能已经实现,然后找到f(n)和f(n-1)关系
c.使用f(n-1)与f(n)的关系去实现f(n)的功能

练习:计算1+2+3+4+...+n
方法一:使用循环

    def func1(n):
        sum1 = 0
        for x in range(1,n+1):
            sum1 += x
        return sum1

方法二:使用递归

    def func2(n):
        # 1.确定临界值
        if n == 1:
            return 1
        # 2.假设func2功能实现了,找func2(n-1),func2(n)的关系
        # func2(n-1)=1+2+3+...+n-1
        # func2(n) = 1+2+3+...+n-1+n = func2(n-1)+n
        # 3.通过func2(n-1)去实现func2(n)的功能
        return func2(n-1)+n

    print(func1(10))
    print(func2(10))

练习:用递归实现:24...*n(要求n是偶数)

    def func3(n):
        if n % 2 == 1:
            print('n必须是偶数')
            return None
        else:
            if n == 2:
                return 2
            return func3(n-2)*n
    print(func3(10))

注意:无用代码不要写,不必一定要else,在函数中可以用return结束的就多用return。
例子:

n = 5
*****
****
***
**
*

    def func4(n):
        if n == 1:
            # 1.确定临界值(一定要让函数结束)
            print('*')
            return None
            # 需要结束的话,直接结束就好,不要和返回值混淆在一起了。
        print('*'*n)
        func4(n-1)
        # f(n)和f(n-1)关系:先打印一行n个*,再执行f(n-1)
    func4(5)

例子:

*
**
***
****
*****

    def func5(n):
        if n == 1:
            print('*')
            return None
        func5(n-1)
        print('*'*n)
    func5(5)

4.函数的调用过程

a.调用函数的时候,首先在栈中开辟一块内存空间,用来保存函数调用过程中产生的数据
(包括函数的参数和在函数中声明的变量)
b.当函数执行完成后,被调用函数对应的内存空间会被回收(释放)

栈:是内存中的一块特殊的区域。数字和字符串的值是存在栈里面
堆:对象是存在堆里面的(在Python中不用我们担心,但是在c语言中这些对象是需要程序员自己申请内存的)

总结:递归要慎用!能用循环做的就不要用递归,因为递归消耗内存也消耗CPU资源

三十一、模块与函数

模块就是指一个.py文件(一个.py文件就是一个模块)
可以在一个模块使用其他模块的函数和类

怎么使用其他模块中的函数?
1.通过import关键字导入模块,然后用过模块名.函数的方法使用模块中的函数
注意!!当我们导入其他的模块的时候会将其他模块中的所有内容都会导入到当前文件中。
如何解决执行语句也被运行?
判断模块的内置属性name的值是否是'main'
将不需要被其他模块导入的代码写到这个if语句中

    if __name__=='__main__':
        print(1,2,3)

关于name属性:
name是每个模块都有的属性,作用是用来存储模块的名字。
当模块不是正在执行的模块,name属性的值是模块对应的文件的文件名
当模块正在执行的时候name的值就是一个固定值'main'

2.通过from-import直接导入指定的函数或者类。导入后就可以直接调用函数
格式:
from 模块名 import 函数名一,函数二

    from qf_math import sum
    print(sum(10,2))

3.通过as关键字给导入的模块或者函数重命名

    import qf_math as my_math
    # 重命名后可以使用新的模块名去调用函数
    pirnt(my_math.sum(1,3,5))

    from qf_math import sum as my_sum
    # 重命名后使用新的函数名调用函数
    print(my_sum(10,2))

4.模块的分类
a.内置函数 (python 自己的)
b.第三方函数(别人写的)
c.自定义函数(自己写的)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,719评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,337评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,887评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,488评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,313评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,284评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,672评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,346评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,644评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,700评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,457评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,316评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,706评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,261评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,648评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,859评论 2 335

推荐阅读更多精彩内容

  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 18,894评论 17 410
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,258评论 8 265
  • 写简书快四个月,写了将近100篇文章,差不多十万字,几乎都是下班带娃后熬夜写完。 但只有寥寥几篇被选入首页专题,最...
    清野拾梦阅读 392评论 6 12
  • 好不容易盼来了星期五的夜晚,希齐大饱眼福——看了会儿电视,玩了阵子游戏。爸爸洗澡,希齐抢先挨妈妈睡下,兄...
    星芳希齐阅读 220评论 0 1
  • 本文作者猫头鹰太太,是我北大学姐,毕业于美国名校,美女学霸一名。现定居美国,无论是自我修炼,还是带好俩娃,她是“总...
    大观家庭阅读 855评论 0 1