python 基础知识第11讲:函数的返回值、作用域、命名空间、递归、高级函数

1.函数的返回值

第一个案例:

# 求任意数的和
# 可以通过return 来指定函数的返回值
def fn(*nums):
    # 定义一个变量来保存结果
    result = 0
    # 遍历元组 并将元组中的元素累加
    for n in nums:
        result += n
    # print(result)
    return result
r = fn(1,2,3)
print(r+6)
  • 返回值可以直接使用,也可以通过一个变量来接收函数返回值的结果。

第二个案例:

def fn():

    # return 100
    # return [1,2,3]
    # return 1+1
    def fn2():
        print('python')
    return fn2
r = fn()
r()
print(r)

  • return后面可以跟任意的对象,甚至可以是一个函数。

第三个案例:

def fn2():
    return
    a = 10
r = fn2()
print(r)
  • 如果仅仅写一个return 或者 不写return 则相当于return None

第四个案例:

def fn3():
    print('hello')
    return
    print('abc')
r = fn3()
  • 在函数中 return后面的代码都不会执行, return 一旦执行函数将自动结束

第五个案例:return,break,continue 区别

def fn4():
    for i in range(5):
        if i == 3:
            #break # 用来退出当前循环
            # continue # 用来跳过当次循环
            return # 用来结束函数
        print(i)
    print('循环结束')
fn4()

由结果我们看出:

  • break 用来退出当前循环
  • continue 用来跳过当次循环
  • return 用来结束函数

第六个案例:fn 和 fn() 的 区别

def fn():
    return 10
print(fn) 
print(fn()) 

执行结果分别是:
<function fn at 0x0000016C54C51268>
10

  • fn 是函数对象 实际上在打印函数对象
  • fn() 是在调用函数 实际上在打印fn()函数的返回值

2. 文档字符串

  • help() 可以查询python 函数中的用法
  • 语法 help(函数对象)
help(print)
def fn(a:int,b:str,c:bool) -> int:
    '''
    函数的参数
    :param a: 作用 ....
    :param b: 作用 ....
    :param c: 作用 ....
    :return: int
    '''
    return 10

help(fn)

3. 函数的作用域

作用域指的是变量生效的区域

  • 在Python中有2种作用域
  • 1 全局作用域
    全局作用域在程序执行时创建,在程序结束时销毁;
    所以函数以为的区域都是全局作用域;
    在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序汇总的任意位置访问;
  • 2 函数作用域
    函数作用域在函数调用时创建,在调用结束时销毁;
    函数每调用一次就会产生一个新函数的作用域;
    在函数作用域中定义的变量 都是局部变量,它只能在函数内部被访问;

示例代码:

a = 20
b = 20
def fn():
    a = 10 #a定义在函数内部,所以它的作用域就是函数内部,函数外部是无法访问的
    print('函数内部:','a =',a)

    print('函数内部:', 'b =', b)
fn()
# print('函数外部:','a =',a)
print('函数内部:','b =',b)

3.1 通过global 关键字改变变量的作用域

a = 20
def fn2():
    # 如果希望在函数内部修改全局变量,则需要使用global关键字,来声明变量
    global a # 声明在函数内部的使用a是全局变量,此时在去修改a时,就是修改全局变量
    a = 10
    print('函数内部:','a =',a)
fn2()
print('函数外部:','a =',a)

4.命名空间

命名空间实际上就是一个字典,是一个专门用来存储变量的字典

  • 使用locals()来获取当前作用域的命名空间
  • 如果在全局作用域中调用locals()函数则获取全局作用域命名空间;
    如果在函数作用域中调用locals()则获取函数命名空间;
    locals() 返回的就是一个字典
a = 1
b = 2
c = 3
s = locals() # 获取当前的命名空间
print(s)
print(a)
print(s['a'])  # 就是s中一个一个的键值对
s['c'] = 200 #增加一个c的变量
print(s)
def fn4():
    a = 10
    s = locals() #在函数内部调用locals()会获取函数的命名空间
    s['b'] = 20 # 可以通过s来操作函数的命名空间,但是不建议这么做
    print(s['b'])
    print(s)
fn4()

一般不建议用这种方法来定义和操作变量

5. 递归

递归式的函数
递归简单理解就是自己去调用自己
递归式函数就是在函数中调用自己

5.1 递归的作用

递归式解决问题的一种方式
递归式函数的两个条件
1.基线条件
问题可以被分解成最小的问题,当满足基线条件时,递归不在执行了
2.递归条件
将问题继续分解的条件
看个例子:

def fn2(n):
    # 基线条件
    if n == 1:
        # 1的阶乘是它本身
        return 1
    # 递归条件
    return  n * fn2(n-1)
print(fn2(10))

5.2 递归练习

  • 1 创建一个函数 来为任意数做任意幂运算
def fn4(n,i):
    # 定义了一个函数 其中有2个参数 n 要做幂运算的数字 i 做幂运算的次数
    # 基线条件 幂为1
    if i == 1:
        return n
    # 递归条件 2*2*2*2 = 16 2**4 2**3 2 ** 2
    return n * fn4(n,i-1)
print(fn4(2,4))
  • 练习二 创建一个函数 用来检查任意的字符串是否是回文字符串,如果是返回True,不是返回False
# 回文字符串 字符串从后往前念和从前往后念是一样的 abcba
# abcdefgfedcba
# 先检查第一个字符和最后一个字符是否一致,如果不一致不是回文字符串
# 如果一致,则看剩余部分是否是回文字符串
# 检查bcdefgfedcb 是不是回文
# 检查cdefgfedc 是不是回文
# 检查defgfed 是不是回文
# 检查 efgfe是不是回文
# 检查 fgf 是不是回文
# 检查 g 是不是回文
def fn5(s):
    # 这个函数就是检查任意一个字符串是否是回文
    # 参数s 就是我们要检查的字符串
    # 基线条件
    if len(s) < 2:
        # 字符串的长度小于2 则这个字符串一定是回文
        return True
    elif s[0] != s[-1]:
        # 第一个字符和最后一个字符不相等,不是回文
        return False
    # 递归条件
    return fn5(s[1:-1])
print(fn5('abcdefgfedcba'))

6.高级函数

特点:
1.接收一个或多个函数作为参数
2.将函数作为返回值返回
满足任意一个特点就是高级函数

def fn(func,lst):
    for n in lst:
        if func(n):
            new_list.append(n)
    # 返回新的列表
    return new_list
print(fn(fn4,l))

当我们使用一个函数作为参数时,实际上是将指定的代码传递进了目标函数,根据传入的不同的函数,就改变了实现的规则。

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

推荐阅读更多精彩内容