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è)回文字符串??!')