Python函数类型

函数简介

函数是python程序重要的组成单元,一个Python程序可以由多个函数组成。

每个函数建议只实现一个功能,这样后续调用中,会更好地减少程序的耦合性,也会提高后续维护效率。

函数形式主要有递归函数、嵌套函数、匿名函数等,以下是本期将主要的函数类型。

函数类型大纲

1. 递归函数

在函数体内部直接或者间接的自己调用自己,称为递归函数。

每个递归函数必现要包含两个部分:

  1. 终止条件
    表示递归什么时候结束,一般用于返回值,不用调用自己。否则程序会陷入到死循环,异常退出
  2. 递归步骤
    把第 n 步的值和第 n-1 步相关联,类似与我们的数学归纳法

递归函数由于会创建大量的函数对象,过量的消耗内存和运算能力,在处理大量数据时,应避免使用

1.1 递归函数底层

递归函数在没有满足终止条件之前,一直不断调用自己,创建函数栈帧,直到满足终止条件为止

才会继续执行后面的步骤,越早创建的越晚输出结果。

我们来看看一个小栗子

def func1(n):

    print("func1:",n)
    
    if n==0:
        print("game over")
    else:
        func1(n-1)
    
    print("func1***",n)
    
func1(5) #调用函数func1
  1. 首先在堆内存中创建函数func1对象
func1
  1. 调用func1()函数,初始化 n 传入的对象是5
调用
  1. 执行过程中,每调用一次函数本身时就会创建一个函数栈帧,直到遇到终止调用函数为止之后,再继续执行后面的步骤
执行
1.2 递归函数实操

学习了上一节,我们知道了递归函数的运行逻辑,那么我们来小试牛刀一下

【经典】计算阶乘

   def function(n):
       if n==1:
           return 1
       else:
           return n*function(n-1)
   print(function(5))

递归函数运行结果

2.嵌套函数

在函数内部定义的函数,称为嵌套函数,也叫内部函数。

嵌套函数的使用范围原则是在哪产生就在哪使用,具体格式如下

def func1():
    
    # 定义嵌套函数func2
    
    def func2():
        
        func2代码块     
     func2()   #只能在func1函数里调用func2函数
嵌套函数

嵌套函数的特点

  1. 封装-数据隐藏

    外部无法访问

def out():

   print("out")
   def inner():

       print("inner")
   inner()

out() 

inner() # 在函数外调用,程序会报Nameerror
嵌套函数运行结果1
  1. 贯彻 DRM 原则

    DRM:Don't repeat yourself

    嵌套函数,可以让 我们在函数内容避免重复代码

# 中文名字
def print_chinesename(firstname,lastname):
    print("{0} {1}".format(firstname,lastname))
# 英文名字
def print_englishname(lastname,firstname):
    print("{0} {1}".format(lastname,firstname))

使用嵌套函数,就减少重复的代码,只用定义一个函数就可以实现上面的需求

def print_name(ischinese,firstname,lastname):

    def inner_print(a,b):
        print("{0} {1}".format(a,b))
    if ischinese:
        inner_print(firstname,lastname)
    else:
        inner_print(lastname,firstname)

print_name(True,"掘","金")
print_name(False,"Clinton","Bill")

嵌套函数运行结果2
  1. 闭包
  • 一个函数定义中引用了函数外定义的变量,并且该函数可以在其定义环境外被执行

  • 闭包必须嵌套在一个函数里,必须返回一个调用外部变量的函数对象,

    具体写法:return后面只写嵌套函数名,不能写括号

def out():

    print("out")
    def inner():

        print("inner")
    return inner #直接返回函数对象

3.eval()函数

3.1 eval函数介绍

eval()函数在我们的工作中也是经常使用的函数。

主要的功能:将字符串str 当成有效的表达式来求值并返回计算结果

参数:

source: 一个python表达式或者函数,compile()返回的代码对象

globals: 可选,必现是dictionary

locals:可选,任意映射对象

eval()函数通常用于处理不同来源代码,如客户端或者文件里面的代码断,这样处理就比较灵活。

eval
3.2 eval()函数操作

eval()函数可以处理任意表达式或代码的数据并返回处理结果。

(1)在可选参数缺省的情况下执行

a = "JueJing"
print(eval('a+"30Day"'))
eval函数运行结果1

(2)指定global参数情况下

a = "JueJing"
g = {'a':"Bob"}  # 指定作用域
print(eval('a+" Jions 30Day"',g))
eval函数运行结果2

(3)指定locals参数情况下

当locals和globals起冲突时,locals是起决定作用的,这在很多编程语言里都是一样的,是作用域的覆盖问题,当前指定的小的作用域会覆盖以前大的作用域。

a = 1
b = 2
c = 3
g = {"a":10,"b":20}
l = {"b":200,"c":300}
print(eval('a+b+c',g,l))
eval运行结果3

4. lambda函数

4.1 lambda函数分析

lambda表达式用来声明匿名函数。

lambda函数是一种简单的,在同一行中定义函数的方法。

lambda函数实际生成了一个函数对象。

lambda表达式只允许包含一个表达式,不能包含复杂语句,该表达式的计算结果就是函数的返回值

lambda表达式基本语法

lambda argument1,argument2,argument3,....:<表达式>
lambda函数

lambda函数可以大大节省内存空间,避免不要的对象创建,提高效率

# 定义一个lambda函数   
m  = lambda a,b,c,d:a+b+c
                         
def test(a,b,c,d):       
                         
    return a+b+c+d    
    
print(test(1,2,3,4))     

4.2 lambda函数常见操作

Lambda函数可以具有任意数量的参数,但只能有一个表达式。

(1)直接赋给一个变量,然后再像一般函数那样调用

m  = lambda a,b,c,d:a+b+c
print(m)

(2)将lambda函数作为参数传递给其他函数比如说结合map、filter、sorted、reduce等

fliter(lambda x:x%3==0,[1,2,3,4,5,6])

squares = map(lambda x:x**2,range(5))

#使用sorted按照第一个元素排序
>>> a=[('b',3),('a',2),('d',4),('c',1)]
>>> sorted(a,key=lambda x:x[0])
>>> [('a',2),('b',3),('c',1),('d',4)]

# 与reduce函数结合使用
from functools import reduce
print(reduce(lambda a,b:'{},{}'.format(a,b),[1,2,3,4,5,6,7,8,9]))

(3)嵌套使用将lambda函数嵌套到普通函数中,lambda函数本身做为return的值

def increment(n):
    return lambda x:x+n
f=increment(4)
f(2)
6

(4)字符串联合,有默认值,也可以用x=(lambda...)这种格式

>>> x=(lambda x='Boo',y='Too',z='Z00':x+y+z)
>>> print(x('Foo'))

>>> 'FooTooZoo'

(5)在tkinter中定义内联的callback函数

import sys
from tkinter import Button,mainloop

x=Button(text='Press me',command=(lambda :sys.stdout.write('Hello,World\n')))
x.pack()
x.mainloop()

(6)判断字符串是否以某个字母开头有

Names = ['Anne', 'Amy', 'Bob', 'David', 'Carrie', 'Barbara', 'Zach']
B_Name= filter(lambda x: x.startswith('B'),Names)
print(B_Name)

['Bob', 'Barbara']

(7)求两个列表元素的和

a = [1,2,3,4]
b = [5,6,7,8]
print(list(map(lambda x,y:x+y, a,b)))

>>> [6,8,10,12]

(8)求字符串每个单词的长度

>>> sentence = "Welcome To JueJing!"
>>> words = sentence.split()
>>> lengths  = map(lambda x:len(x),words)
>>> print(list(lengths))
[7, 2, 8]
>>> 

总结

本期介绍的几种函数类型是我们工作中常用的,掌握好它们,能让我们的工作事半功倍哦

好啦,以上是本期内容,欢迎大佬们评论区指正,下次见~

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

推荐阅读更多精彩内容