10 积硅步,至千里——函数下

目录

• 1. 函数的返回值
• 2. 文档字符串
• 3. 函数的作用域
• 4. 命名空间
• 5. 递归函数

1. 函数的返回值

• 返回值就是函数执行以后返回的结果
• 通过return来指定函数的返回值
• return后面可以跟任意对象,返回值甚至可以是一个函数

def fn():

    # return 100
    # return 'python'
    # return [1,2,3]
    # return {'name':'张三'}
    def fn2():
        print('hello')

    return fn2 #返回函数本身
r = fn()
print(r)
#<function fn.<locals>.fn2 at 0x000001D3338ACBF8>
print(fn())
#<function fn.<locals>.fn2 at 0x0000025DCF53CB70>
r()
# hello
- 如果仅仅写一个return,或者不写return,则相当于return None
def fn2():

   return

r = fn2()
print(r)
# None
- 在函数中 return后面的代码都不会执行,return一旦执行函数自动结束
#没讲return什么,还是返回none
def fn3():

    print('hello')
    return
    print('123')

r = fn3()
print(r)
# hello
# None



def fn3():

    print('hello')
    return
    print('123')

r = fn3()
# print(r)
r
# hello

return v.s. break

def fn4():

    for b in range(5):
        if b == 3:
            # break
            return # 用来结束函数
        print(b)
    print('循环执行完毕')

fn4()
# 0   
# 1
# 2

def fn4():

    for b in range(5):
        if b == 3:
            break
            # return # 用来结束函数
        print(b)
    print('循环执行完毕')

fn4()
# 0
# 1
# 2
# 循环执行完毕
  • fn5和fn5()的区别
    fn5是函数对象 #print结果:func of f5...
    fn5()是在调用函数

2. 文档字符串

• help()是Python中内置函数,通过help()函数可以查询Python中函数的用法。

image.png

• 在定义函数时,可以在函数内部编写文档字符串,文档字符串(```)就是对函数的说明。

def fn(a:bool,b:int,c:str)->int: #对传参&返回值格式有要求

    '''
    这个函数式一个文档字符串的实例
    参数
        a:作用 类型 默认值......
        b:作用 类型 默认值......
        c:作用 类型 默认值......


    '''

    return 100

help(fn)

3. 函数的作用域

• 作用域(scope):变量生效的区域

  • 在Python中一共有两种作用域
全局作用域

• 全局作用域在程序执行时创建,在程序执行结束时销毁
• 所有函数以外的区域都是全局作用域
• 在全局作用域中定义的变量,都是全局变量,全局变量可以在程序的任意位置进行访问

函数作用域

• 函数作用域在函数调用时创建,在调用结束时销毁
• 函数每调用一次就会产生一个新的函数作用域
• 在函数作用域中定义的变量,都是局部变量,它只能在函数内部被访问

函数作用域可以从内往外看,不能从外网内调用
在函数内部修改全局作用域 global 变量
def fn3():
    # global a
    a = 50

    print('函数内部:','a =',a)

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

    print('函数内部:','a =',a)

fn3()
print('函数外部:','a =',a)
# 函数内部: a = 50
# 函数外部: a = 50

4. 命名空间

• 命名空间实际上就是一个字典,是一个专门用来存储变量的字典
• locals()用来获取当前作用域(函数/全局)的命名空间
• 如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()则获取函数命名空间。

def fn3():

    global a
    a = 50

    print('函数内部:','a =',a)


s = locals()
print(s)
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002179630B240>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/DELL/Desktop/基础资料-第十讲/课堂源码/命名空间.py', '__cached__': None, 'a': 20, 'fn3': <function fn3 at 0x00000217946E1EA0>, 's': {...}}
s['c']=100 #在空间里新增一个键值对‘c’:100
print(c)
#100
  • 在函数中用globals()获取全局命名空间
def fn4():

    # a = 10
    # s = locals() # 获取函数内部的命名空间
    # s['b'] = 20
    # print(s)

    global_s = globals()
    global_s['a'] = 30 #修改全局变量
    print(global_s)
fn4()
#{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000208D86AB240>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/DELL/Desktop/基础资料-第十讲/课堂源码/命名空间.py', '__cached__': None, 'a': 30, 'fn4': <function fn4 at 0x00000208D85A1EA0>}

• 返回值是一个字典

5. 递归函数

• 递归是解决问题的一种方式,它的整体思想,是将一个大问题分解为一个个的小问题,直到问题无法分解时,在去解决问题。

e.g.求任意数的阶乘
# 求任意数的阶乘
def fn(n):
    # 定义一个函数,储存结果
    result=n
    for i in range(1,n):
        n*=i
    return result
print(fn(3))
  • 递归简单理解就是自己去引用自己
  • 递归式函数,在函数中自己调用自己
• 递归式函数有2个条件

• 1. 基线条件 问题可以被分解为最小问题,当满足基线条件时,递归就不执行了
• 2. 递归条件 可以将问题继续分解的条件

def fn2(n):

    # 参数 n要求阶乘的数字

    # 1.基线条件

    if n == 1:
        # 1的阶乘就是1 直接返回结果
        return 1


    # 2.递归条件

    return n * fn2(n-1)

print(fn2(10))
#3628800
# 10**6=10*10**5
def fn(i,k):
    # 基数条件
    if k==1:
        return i
    # 递归运算
    return i*fn(i,k-1) #i**(k-1)
print(fn(2,2))

找回文字符

def fn2(s):

  # 参数s就是要检查的字符串

  # 1.基线条件
  # 字符串的长度小于2 则字符串一定是个回文
  if len(s)<2:
      return True
  # # 第一个字符和最后一个字符不相同,则一定不是回文字符串
  elif s[0] != s[-1]:
       return False
  # 2.递归条件
  return fn2(s[1:-1])


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

推荐阅读更多精彩内容

  • 本文的主题都是关于函数的  1. 函数的语法;  2. 函数的对象;  3. 函数装饰器;  4. lambda表...
    杨强AT南京阅读 880评论 0 1
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,551评论 0 5
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,746评论 2 9
  • 函数只定义一次,但可能被执行或调用任意次。JS函数是参数化的,函数的定义会包括一个称为形参的标识符列表,这些参数在...
    PySong阅读 522评论 0 0
  • 函数只定义一次,但可能被执行或调用任意次。JS函数是参数化的,函数的定义会包括一个称为形参的标识符列表,这些参数在...
    PySong阅读 849评论 0 0