09-函數(shù)二

09-函數(shù)二

  • 1、函數(shù)的返回值
    • 返回值就是函數(shù)執(zhí)行以后返回的結(jié)果
    • 通過return來指定函數(shù)的返回值
    • return后面可以跟任意對(duì)象,返回值甚至可以是一個(gè)函數(shù)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/9/9 0009 13:17
# @Author  : Oliver
#可以直接使用函數(shù)的返回值,也可以通過一個(gè)變量來接收返回值
#return 后面可以跟任意的對(duì)象,甚至于是函數(shù)
def fn():
    #return 123
    # return 'hello'
    # return {'a':0}
    def fn2():
        print('python')
    return fn2#返回函數(shù)對(duì)象
r=fn()
r()
#如果僅僅寫一個(gè)return,或者沒有寫return就相當(dāng)于return None
def fn3():
    return
r=fn3()
print(r)
#return一旦執(zhí)行函數(shù)自動(dòng)結(jié)束
def fn4():
    print('python')
    return
    print('abc')
r=fn4()
print(r)

def fn5():
    for i in range(5):
        if i ==3:
            #break
            return #return可以用來結(jié)束函數(shù)
        print(i)
    print('循環(huán)執(zhí)行完畢')

r=fn5()
print(r)

結(jié)果顯示:

python
None
python
None
0
1
2
循環(huán)執(zhí)行完畢

Process finished with exit code 0

  • 2、文檔字符串
    • help()是Python中內(nèi)置函數(shù),通過help()函數(shù)可以查詢Python中函數(shù)的用法
    • 在定義函數(shù)時(shí),可以在函數(shù)內(nèi)部編寫文檔字符串,文檔字符串就是對(duì)函數(shù)的說明
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/9/9 0009 13:37
# @Author  : Oliver
'''
help()
通過help()函數(shù)可以查詢其他函數(shù)的用法
語法:help(函數(shù)對(duì)象)
'''
#help(print)
def fn(a:int,b:str,c:bool)->int:
    '''
    這個(gè)函數(shù)的功能就是一個(gè)文檔字符串的說明

    參數(shù)
    a,作用,類型,有沒有默認(rèn)值
    b,作用,類型,有沒有默認(rèn)值
    c,作用,類型,有沒有默認(rèn)值
    返回值:.....

    '''
    return 1
help(fn)

結(jié)果顯示:

Help on function fn in module __main__:

fn(a: int, b: str, c: bool) -> int
    這個(gè)函數(shù)的功能就是一個(gè)文檔字符串的說明
    
    參數(shù)
    a,作用,類型,有沒有默認(rèn)值
    b,作用,類型,有沒有默認(rèn)值
    c,作用,類型,有沒有默認(rèn)值
    返回值:.....


Process finished with exit code 0

  • 3.、函數(shù)的作用域
    • 作用域(scope)
    • 作用域指的是變量生效的區(qū)域
    • 在Python中一共有兩種作用域
      • 全局作用域
        • 全局作用域在程序執(zhí)行時(shí)創(chuàng)建,在程序執(zhí)行結(jié)束時(shí)銷毀
        • 所有函數(shù)以外的區(qū)域都是全局作用域
        • 在全局作用域中定義的變量,都是全局變量,全局變量可以在程序的任意位置進(jìn)行訪問
      • 函數(shù)作用域
        • 函數(shù)作用域在函數(shù)調(diào)用時(shí)創(chuàng)建,在調(diào)用結(jié)束時(shí)銷毀
        • 函數(shù)每調(diào)用一次就會(huì)產(chǎn)生一個(gè)新的函數(shù)作用域
        • 在函數(shù)作用域中定義的變量,都是局部變量,它只能在函數(shù)內(nèi)部被訪問
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/9/9 0009 13:46
# @Author  : Oliver
b=20
def fn():
    #a定義在了函數(shù)的內(nèi)部,所以他的作用域就是函數(shù)的內(nèi)部,函數(shù)外部是無法訪問到的
    a=10
    print('函數(shù)內(nèi)部:','a=',a)
    print('函數(shù)內(nèi)部:','b=',b)

fn()
#print('函數(shù)內(nèi)部:','a=',a)#NameError: name 'a' is not defined
print('函數(shù)外部:','b=',b)
#就像是車貼黑膜,里面看得見外面,外面看不見里面的
def fn2():
    a=30
    def fn3():
        print('fn3中 a=',a)
    return fn3()
fn2()

a=20
def fn3():
#如果希望在函數(shù)內(nèi)部修改全局變量,則需要使用global來聲明變量。
    #a=10
    global a
    a=100
    print('函數(shù)內(nèi)部a=',a)

fn3()
print('函數(shù)外部a=',a)

結(jié)果顯示:

函數(shù)內(nèi)部: a= 10
函數(shù)內(nèi)部: b= 20
函數(shù)外部: b= 20
fn3中 a= 30
函數(shù)內(nèi)部a= 100
函數(shù)外部a= 100

Process finished with exit code 0

  • 4、命名空間
    • 命名空間實(shí)際上就是一個(gè)字典,是一個(gè)專門用來存儲(chǔ)變量的字典
    • locals()用來獲取當(dāng)前作用域的命名空間
    • 如果在全局作用域中調(diào)用locals()則獲取全局命名空間,如果在函數(shù)作用域中調(diào)用locals()則獲取函數(shù)命名空間
    • 返回值是一個(gè)字典
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/9/9 0009 14:15
# @Author  : Oliver

#命名空間就是一個(gè)字典,是一個(gè)專門用來存儲(chǔ)變量的
#通過locals()來獲取當(dāng)前作用域的命名空間,返回是一個(gè)字典

a=20
scope=locals()
print(scope)
print(scope['a'])

scope['c']=1000
print(c)#雖然會(huì)有警告,但是運(yùn)行的時(shí)候是不會(huì)顯示錯(cuò)誤的

def fn1():
    a=50
    scope=locals()

    print(scope)
fn1()#獲取的是函數(shù)內(nèi)部的,所以會(huì)是空的

def fn4():
    a=50
    scope=locals()
    scope['c']=1000
    print(scope)
    #print(c)這句話是會(huì)報(bào)錯(cuò)的,這就和之前的全局的有差別,但是從上面的scope來看,c確確實(shí)實(shí)的已經(jīng)添加進(jìn)去了
    print(scope['c'])#這樣才是可以的
fn4()

#都添加進(jìn)去
b=100
def fn5():
    a=50
    g=globals()
    print(g)
fn5()

結(jié)果顯示:

{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001A167E91880>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/demo/命名空間.py', '__cached__': None, 'a': 20, 'scope': {...}}
20
1000
{'a': 50}
{'a': 50, 'c': 1000}
1000
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001A167E91880>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/demo/命名空間.py', '__cached__': None, 'a': 20, 'scope': {...}, 'c': 1000, 'fn1': <function fn1 at 0x000001A167FDD0D0>, 'fn4': <function fn4 at 0x000001A167FDD1F0>, 'b': 100, 'fn5': <function fn5 at 0x000001A167FDD280>}

Process finished with exit code 0

  • 5、遞歸函數(shù)
    • 遞歸是解決問題的一種方式,它的整體思想,是將一個(gè)大問題分解為一個(gè)個(gè)的小問題,直到問題無法分解時(shí),在去解決問題
    • 遞歸式函數(shù)有2個(gè)條件
      • 1、基線條件 問題可以被分解為最小問題,當(dāng)滿足基線條件時(shí),遞歸就不執(zhí)行了
      • 2、遞歸條件 可以將問題繼續(xù)分解的條件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/9/9 0009 14:33
# @Author  : Oliver

#嘗試求10的階乘
print(1*2*3*4*5*6*7*8*9*10)#3628800

n=10
for i in range(1,10):
    n*=i
print(n)

#想求任意數(shù)的階乘
#定義一個(gè)函數(shù) 求任意數(shù)的階乘
def fn(n):
    #參數(shù)n表示要求階乘的數(shù)字
    #定義一個(gè)變量來保存結(jié)果
    r=n
    for i in range(1, n):
        r *= i
    return r
print(fn(10))

#遞歸是解決問題的一種方式
#和循環(huán)非常的像
#他的整體思想:是將大的問題分解為一個(gè)個(gè)小問題,直到問題無法分解時(shí),再去解決問題
#遞歸式函數(shù)
#遞歸簡單理解就是自己調(diào)用自己
#遞歸式函數(shù)就是在函數(shù)中自己調(diào)用自己
#遞歸函數(shù)有兩個(gè)條件
#1.基線條件
#問題可以被分解為最小的問題,當(dāng)滿足基線條件時(shí),遞歸就不再執(zhí)行了
#2.遞歸條件
#用遞歸的方式來解決,任意數(shù)的階乘
def fn3(n):
    #1.基線條件  判斷用戶讓求的數(shù)字是1的話,我們就滿足基線條件,就不再遞歸了
    if n==1:
        #1的階乘就是1
        return 1
    #2.遞歸條件
    return n * fn3(n-1)
print(fn3(10))

##練習(xí)
#定義一個(gè)函數(shù)來為任意數(shù)字做冪運(yùn)算n**i
def fn4(n,i):
    #1.基線條件
    if i==1:
        return n
    #2.遞歸條件
    return n * fn4(n,i-1)
print(fn4(10,5))

結(jié)果顯示:

3628800
3628800
3628800
3628800
100000

Process finished with exit code 0

  • 課堂作業(yè):
    • 定義一個(gè)函數(shù),用來檢查一個(gè)任意的字符串是否是回文字符串,如果是返回True,不是返回False。回文字符串從前往后念和從后往前念是一樣的。例如 TNT
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/9/9 0009 15:12
# @Author  : Oliver

# 定義一個(gè)函數(shù),
# 用來檢查一個(gè)任意的字符串是否是回文字符串,
# 如果是返回True,不是返回False。
# 回文字符串從前往后念和從后往前念是一樣的。
# 例如 TNT
n=input('請(qǐng)輸入一個(gè)字符串:')
str=n[::-1]
if n==str:
    print(n,'是一個(gè)回文字符串!!')
else:print(n,'不是一個(gè)回文字符串??!')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容