python函數(shù)(初級)

函數(shù)

1.匿名函數(shù)

"""
匿名函數(shù)就是沒有函數(shù)名的函數(shù):匿名函數(shù)可以看成是類型是function的值,和10,'abc'是同類的數(shù)據(jù)
注意: 匿名函數(shù)本質(zhì)還是函數(shù),函數(shù)中除了聲明函數(shù)以外其他的都使用

1)語法
lambda 參數(shù)列表: 返回值

2)說明

  • lambda - 關(guān)鍵字
  • 參數(shù)列表 - 參數(shù)名1,參數(shù)名2,...
  • : - 固定
  • 返回值 - 任何有結(jié)果的表達式,它是匿名函數(shù)的函數(shù)體,相當(dāng)于普通函數(shù)中的return語句
如:lambda x,y: x+y
調(diào)用(用一個變量名存儲):
fn1 = lambda x,y: x+y
print(fn1(2,3))
  1. 參數(shù)
    普通函數(shù)中除了用'參數(shù)名:類型'的形式來指定參數(shù)類型以為,其他的語法匿名函數(shù)都支持
10   # int類型的數(shù)據(jù)
'abc'  # str類型的數(shù)據(jù)
[1,2,3]  # list類型的數(shù)據(jù)
lambda x:x  # function類型的數(shù)據(jù),一般用做調(diào)用

str1 = 'abca'
str2 =str1.replace('a','A')
print(str2)

變量的作用域

1.變量的作用域:變量在程序中能夠使用的范圍

2.全局變量和局部便令

1)全局變量:沒有聲明在函數(shù)里面或者類里面的變量就是全局變量.
作用域是從聲明開始到文件結(jié)束的任何位置

2)局部變量:聲明在函數(shù)中的變量就是局部變量(函數(shù)的參數(shù)相當(dāng)于聲明在函數(shù)中的變量)
作用域是從聲明開始到函數(shù)結(jié)束的任何位置

函數(shù)調(diào)用過程(內(nèi)存方面):壓棧
當(dāng)調(diào)用函數(shù)的時候,系統(tǒng)會自動在內(nèi)存的棧區(qū)間為這個函數(shù)開辟一個獨立的內(nèi)純區(qū)域,
用來保存在函數(shù)中聲明的變量,當(dāng)函數(shù)調(diào)用結(jié)束后,這個內(nèi)存會自動釋放.

a = 10          # a是全局變量
for x in range(5):           # x是全局變量
    b = 20                   # b是全局變量
    pass


def fun2(y):              # y是局部變量
    z = 100               # z是局部變量

3.global和nonlocal

"""
global和nonlocal函數(shù)中的關(guān)鍵字,和return一樣只能在函數(shù)體中使用
1)global - 在函數(shù)中聲明一個全局變量
global 變量
變量 = 值

2)nonlocal - 在局部的局部中修改局部變量的值
nonlocal 變量
變量 = 值

# 這里的a是全局變量
a=10
def func3():
  # 這里的a是局部變量
  a = 20
  # 將b定義為全局變量
  global b
  b = 30
  print('函數(shù)內(nèi)部a',a)   # 函數(shù)內(nèi)部a 20
  print('函數(shù)內(nèi)部b',b)   # 函數(shù)內(nèi)部b 30

func3()
print("函數(shù)外面a",a)    # 函數(shù)外面a 10
print("函數(shù)外面b",b)    # 函數(shù)外面b 30

def func4():
  a1 = 100
  def func5():
      nonlocal a1
      a1 = 200
      print('函數(shù)中的函數(shù)中的a1',a1)
  func5()
  print('函數(shù)中的a1',a1)
func4()

函數(shù)遞歸

1.聲明遞歸函數(shù)

自己調(diào)用自己的函數(shù)(函數(shù)體中調(diào)用當(dāng)前函數(shù))
遞歸如果產(chǎn)生死循環(huán)達到一定程度會報錯

注意:
一般循環(huán)能做的事情遞歸都能做
循環(huán)能做的一般不要用遞歸做
遞歸會在某個點占用大量內(nèi)存
對cpu的消耗也很高

def func1(n):
    if n>3:
        n-=1
        print(n)
        func1(n)
    else:
        print('2')

# func1(5)

2.怎么寫遞歸函數(shù)

第一步:找臨界值(循環(huán)結(jié)束的條件) - 在這兒需要結(jié)束函數(shù)
第二步:找關(guān)系. - 找f(n)和f(n-1)的關(guān)系(找當(dāng)次循環(huán)和上次循環(huán)的關(guān)系)
第三步:假設(shè)函數(shù)的功能已經(jīng)實現(xiàn),根據(jù)關(guān)系用f(n-1)去實現(xiàn)f(n)的功能

# 用遞歸實現(xiàn):1+2+3+4+5+6+...+N
def sum1(n:int):
    # 第一步:找臨界值
    if n == 1:
        return 1
    # 第二步:sum1(n)和sum(n-1)
    # sum1(n) = sum1(n-1)+n
    return n + sum1(n-1)


# print(sum1(10))

練習(xí):用遞歸實現(xiàn)以下功能

def func2(n):
    if n == 1:
        return '*'+'\n'
    return '*'*n + '\n'+ func2(n-1)     # 倒打印
    # return func2(n-1)+'*'*n + '\n'    # 正打印


print(func2(5))

迭代器

1.迭代器(iter)

迭代器宛如一個深不見底的瓶子,看不見里面的數(shù)據(jù),只能每次取出看,取出后也放不進去了
迭代器作為容器可以保存多個數(shù)據(jù);
數(shù)據(jù)的來源:1)將其它序列轉(zhuǎn)換成迭代器,2)生成器

1)將其他序列轉(zhuǎn)換成迭代器

iter1 = iter('abc')
print(iter1,type(iter1))

iter2 = iter([12,23,43,54,54])
print(iter2,type(iter2))

2.獲取元素

不管用那種方式去獲取了元素的值,那么這個元素在迭代器中就不存在了
1)獲取單個元素:next(迭代器)/ 迭代器.next() -> 獲取迭代器中的第一個元素
2)遍歷:同樣取完就沒有了
for 變量 in 迭代器:
pass

iter3 = iter('hello')
print(next(iter3))    # h,取出就不在放回
print(next(iter3))    # e
print(next(iter3))    # l
print(iter3.__next__())    # l
print(iter3.__next__())    # o,此時已經(jīng)取完,迭代器為空,再取會報錯:StopIteration

生成器

1.什么是生成器

  1. 生成器就是迭代器中的一種
  2. 調(diào)用一個帶有yield關(guān)鍵字的函數(shù)就可以得到一個生成器
    如果一個函數(shù)中有yield關(guān)鍵字:
    a. 調(diào)用函數(shù)不會執(zhí)行函數(shù)體
    b. 函數(shù)調(diào)用表達式的值不是函數(shù)的返回值,而是一個生成器對象
    c. yield后邊可以跟數(shù)據(jù)桨吊,相當(dāng)于return娶眷;同一個函數(shù)可以有多個yield

2.怎么去創(chuàng)建一個生成器

def func1():
    print('=====')
    yield
    return 100


gen1 = func1()     #這的gen1就是一個生成器對象
# print('外部:',gen1)    # 外部: <generator object func1 at 0x000001A3EF433570>

3.生成器產(chǎn)生數(shù)據(jù)的原理

1) 一個生成器能夠產(chǎn)生多少數(shù)據(jù),就看執(zhí)行完生成器對應(yīng)的函數(shù)的函數(shù)體會遇到幾次yield肺缕;yield后面的值就是生成器能夠產(chǎn)生的數(shù)據(jù)
2) 每次獲取生成器中的元素的時候趋观,都是先去執(zhí)行函數(shù)體垃沦,直到遇到y(tǒng)ield,并且將yield后面的值作為獲取元素的結(jié)果坤学;
并且保留結(jié)束的位置疯坤,下次獲取下一個值的時候,從上次結(jié)束的位置接著執(zhí)行函數(shù)體深浮,知道遇到y(tǒng)ield...
如果從開始執(zhí)行到函數(shù)結(jié)束到?jīng)]有遇到y(tǒng)ield压怠,就會報StopIteration的錯誤
注意:return后面的yield是執(zhí)行不了的,因為函數(shù)被終止飞苇,遇不到y(tǒng)ield

def func2():
    print('++++++')
    yield
    print('--------')
    yield 100


gen2 = func2()
print('外部:',next(gen2))   # 打泳薄:++++++         外部: None
print('外部:',next(gen2))   # 打印:------         外部: 100
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末布卡,一起剝皮案震驚了整個濱河市雨让,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忿等,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異娃闲,居然都是意外死亡虚汛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門皇帮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛋辈,你說我怎么就攤上這事属拾。” “怎么了冷溶?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵渐白,是天一觀的道長。 經(jīng)常有香客問我逞频,道長纯衍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任苗胀,我火速辦了婚禮襟诸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘基协。我一直安慰自己歌亲,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布哑姚。 她就那樣靜靜地躺著贸辈,像睡著了一般腿准。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悍缠,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音耐量,去河邊找鬼飞蚓。 笑死,一個胖子當(dāng)著我的面吹牛拴鸵,可吹牛的內(nèi)容都是我干的玷坠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼劲藐,長吁一口氣:“原來是場噩夢啊……” “哼八堡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起聘芜,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤兄渺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后汰现,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挂谍,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡叔壤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了口叙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炼绘。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妄田,靈堂內(nèi)的尸體忽然破棺而出俺亮,到底是詐尸還是另有隱情,我是刑警寧澤疟呐,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布脚曾,位于F島的核電站,受9級特大地震影響启具,放射性物質(zhì)發(fā)生泄漏本讥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一鲁冯、第九天 我趴在偏房一處隱蔽的房頂上張望拷沸。 院中可真熱鬧,春花似錦晓褪、人聲如沸堵漱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勤庐。三九已至,卻和暖如春好港,著一層夾襖步出監(jiān)牢的瞬間愉镰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工钧汹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丈探,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓拔莱,卻偏偏與公主長得像碗降,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子塘秦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 函數(shù) 1讼渊、什么是函數(shù) 是實現(xiàn)某一特定功能的代碼塊的封裝 2、函數(shù)的分類 系統(tǒng)函數(shù)(內(nèi)置函數(shù)) - 系統(tǒng)已經(jīng)實現(xiàn)了的...
    Error_2d57閱讀 113評論 0 0
  • 函數(shù) 一尊剔、匿名函數(shù) 匿名函數(shù)就是沒有函數(shù)名的函數(shù)爪幻;匿名函數(shù)可以看成類型是function的值和10,'abc'是同...
    ______n___閱讀 145評論 0 0
  • 1.匿名函數(shù) 匿名函數(shù)就是沒有函數(shù)名的函數(shù); 匿名函數(shù)可以看成是類型是function的值和10, 'abc'是同...
    tcis閱讀 134評論 0 0
  • 函數(shù) review 1.概念: 對實現(xiàn)特定功能的代碼的封裝2.函數(shù)的聲明def 函數(shù)名(形參列表):函數(shù)說明文檔函...
    漫磋嗟閱讀 227評論 0 0
  • 7月18日 星期一 雨轉(zhuǎn)晴 上次,我和杜晨楊去水上游樂場玩挨稿。 那里的水很淺仇轻,我沒有帶浮板。我們下了水奶甘,一艘鴨小...
    毛毛蟲爬呀爬閱讀 230評論 0 0