Python基礎(chǔ) - 函數(shù)的應(yīng)用

知識回顧

1.函數(shù)的聲明

def 函數(shù)名(參數(shù)1:類型油宜, 參數(shù)2:類型):
    函數(shù)說明文檔
    函數(shù)體

補充:參數(shù)列表中点待,可以通過‘參數(shù)名:類型名’指定參數(shù)的類型大渤,也可以通過設(shè)置默認值來說明參數(shù)的類型
說明類型的好處:a.傳什么類型的值一目了然
b.實現(xiàn)函數(shù)體的時候璧尸,可以有相關(guān)提示

聲明函數(shù)的時候不會執(zhí)行函數(shù)

2.函數(shù)的調(diào)用

函數(shù)名(實參列表)

調(diào)用過程:
第一步:回到函數(shù)聲明的位置
第二步:用實參給形參賦值 --> 傳參(保證每個參數(shù)都要有值)
第三步:執(zhí)行函數(shù)體
第四步:確定返回值 --> 將函數(shù)調(diào)用表達式設(shè)置為返回值
第五步:回到函數(shù)調(diào)用的位置,接著往后執(zhí)行

3.函數(shù)的參數(shù)

位置參數(shù)
關(guān)鍵字參數(shù)

參數(shù)的默認值 ——> 有默認值的參數(shù)要放在沒有默認值的參數(shù)后面

不定長參數(shù)

4.返回值

python中所有函數(shù)都有返回值肆资。
如果遇到return,函數(shù)的返回值就是return后面的值梯醒;
沒有遇到return就是None

返回值就是函數(shù)調(diào)用表達式的值

調(diào)用函數(shù)的目的:a.執(zhí)行函數(shù)體 b.獲取返回值

return的作用:a.返回返回值 b.結(jié)束函數(shù)(函數(shù)中遇到return就結(jié)束)



def func2(a=0, b=0):
    print(a + b)


def func1(a, b) -> int:
    """
    求兩個數(shù)的和
    :param a: 數(shù)字宽堆,整型
    :param b: 數(shù)字,整型
    :return: 和
    """
    return a + b


func1(1, 2)
func2(1, 2)


def func3(a, b) -> list:
    return [a, b]


re = func3(10, 20)
re.append(30)
print(re)


補充:不定長參數(shù)(面試題)
*參數(shù)名:將位置參數(shù)作為元組的元素茸习。參數(shù)就是一個元組
**參數(shù)名:將關(guān)鍵字參數(shù)畜隶,一參數(shù)名為key,實參為值組合成鍵值對号胚,作為字典的元素籽慢。參數(shù)是一個字

注意:經(jīng)常將*args和**kwargs組合在一起使用,但是使用的時候*要在**前面

*args, **kwargs 之間的區(qū)別



def func4(*arg):
    print(arg)


func4(1, 2, 3, 4)


def func5(**args):
    print(args)


func5(a=1, b=2, c=3, d=4)


def func6(*args, **kwargs):
    print(args, kwargs)


func6(12, 34)
func6(a=12, b=23)
func6(10, 20, c=30, d=40)

匿名函數(shù)

1.普通函數(shù):

def 函數(shù)名(參數(shù)列表):
    函數(shù)體

2.匿名函數(shù):

函數(shù)名 = lambda 參數(shù)列表:返回值

說明:
函數(shù)名 --> 變量名
lambda --> 關(guān)鍵字
參數(shù)列表 --> 參數(shù)名1猫胁, 參數(shù)名2...
返回值 --> 相當于只有一個return語句的函數(shù)體

匿名函數(shù)的調(diào)用和普通函數(shù)一樣:函數(shù)名(實參列表),也支持位置參數(shù)箱亿、關(guān)鍵字參數(shù)、參數(shù)設(shè)置默認值弃秆、不定長參數(shù)

寫一個匿名函數(shù)届惋,功能是求兩個數(shù)的和

sum1 = lambda num1, num2: num1 + num2

print(sum1(1, 2))

練習(xí):求1+2+...+n的和

sum2 = lambda n: sum(range(n + 1))

print(sum2(100))

練習(xí):讀程序

funcs = []
for item in range(1, 5):
    funcs.append(lambda x: x * item)
    print(funcs)

print(funcs[0](2))
print(funcs[1](2))

變量的作用域

1.變量的作用域

變量的作用域指的是變量能夠使用的范圍

2.全局變量

聲明在函數(shù)和類的外面的變量都是全局變量。作用域是從聲明開始菠赚,到整個py文件結(jié)束

3.局部變量:

聲明在函數(shù)和類中的變量都是局部變量脑豹。作用域是從聲明開始到整個函數(shù)結(jié)束

4.global關(guān)鍵字

在函數(shù)中說明一個變量是全局變量
注意:只能在函數(shù)中使用

name = 'abc'


def func2():
    global age
    age = 18
    global name  #說明當前函數(shù)中使用的name是全局變量name
    name = 'aaa'
    print(name)


func2()
print(name)
print(age)

5.nonlocal關(guān)鍵字

想要在局部的局部中修改局部變量



def func3():
    abc = 100

    def func4():
        nonlocal abc
        abc = 100
        print(abc)
    func4()
    print(abc)


func3()

函數(shù)作為變量

聲明函數(shù)就是聲明一個類型是function的變量,函數(shù)名實質(zhì)就是變量名



def func1():
    print('__')


print(type(func1))


1.變量可以給其他變量賦值

func1 = lambda x: print(x)
func2 = func1
func2(2)

聲明一個變量function锈至,類型是function

def func3():
    print('111')

用一個函數(shù)給變量a賦值晨缴,a也是一個函數(shù)

a = func3
a()
print(a)

將函數(shù)func11的返回值給b,b的值也是None

b = func3()
print(b)

2.函數(shù)作為列表的元素

a = 10
list1 = [1, a]
print(list1, list1[1] + 100)


def func22():
    print('打印1111111')
    return 10


list2 = [1, func22, func22()]
print(list2)

# list2[1]取到一個函數(shù)峡捡,通過后面加()調(diào)用函數(shù)
print(list2[1]())

# list2[2]取到的是整數(shù)10
print(list2[2] + 100)


3.將函數(shù)作為參數(shù)

a = 10


def func1(n):
    print(n)


func1(a)


def func11(n):
    n = func12
    n()


def func12():
    print("hello world")


func11(func22)

應(yīng)用

列表.sort(key = None, reverse = False)
使用sort的時候,可以通過給key賦給一個函數(shù)變量筑悴,來規(guī)定列表中的元素按照什么標準來排序
這的函數(shù)變量要求

list1 = [1, 45, 8, 89]
list1.sort()
print(list1)

list2 = [
    {'name': '張三', 'age': 22, 'score': 98},
    {'name': '李四', 'age': 19, 'score': 100},
    {'name': '王五', 'age': 20, 'score': 78}
]


def get_age(item):
    return item['score']


# list2.sort(key=lambda item: item['age'])
list2.sort(key=get_age)
print(list2)

list3 = [
    ('a', 10),
    (20, 2),
    ('b', 30)
]

#
# def second(item):
#     return item[1]
#
#
# list3.sort(key=second, reverse=True)
# print(list3)

list3.sort(key=lambda item: item[1])
print(list3)


4.將函數(shù)作為返回值

# 根據(jù)運算符號们拙,返回對應(yīng)的功能
def operation(operator):
    if operator == '+':
        def func1(*args, **kwargs):
            sum1 = 0
            for item in args:
                sum1 += item
            for key in kwargs:
                sum1 += kwargs[key]
            return sum1
        return func1
    elif operator == '*':
        def func2(*args, **kwargs):
            sum1 = 1
            for item in args:
                sum1 *= item
            for key in kwargs:
                sum1 *= kwargs[key]
            return sum1
        return func2


# f1 = operation('+')
# re = f1(10, 20)
print(operation('+')(100, 200))

print(operation('*')(100, 200, a=200))

函數(shù)的調(diào)用

1.補充:python中的函數(shù)可以有多個返回值


# 求多個數(shù)的和以及平均值
def my_sum(*nums):
    sum1 = sum(nums)
    average = sum1 / len(nums)
    return sum1, average    #同時返回和、平均值


a, b = my_sum(1, 2, 3, 4, 5)
num = my_sum(1, 2, 3, 4, 5)
print(a, b)
print(num[0], num[1])

2.函數(shù)的調(diào)用過程是一個壓棧的過程

每次調(diào)用函數(shù)的時候阁吝,系統(tǒng)都會在內(nèi)存中(棧)開辟空間來存儲函數(shù)執(zhí)行過程中產(chǎn)生數(shù)據(jù)(函數(shù)中聲明的變量)
當函數(shù)調(diào)用完成后砚婆,這塊內(nèi)存會自動銷毀。

遞歸函數(shù)

1.什么是遞歸函數(shù)

遞歸函數(shù):函數(shù)中調(diào)用函數(shù)本身突勇,這樣的函數(shù)就是遞歸函數(shù)(自己調(diào)用自己)

循環(huán)能做的事情遞歸都能做装盯,但是實際上循環(huán)能解決的問題絕對不選遞歸

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

第一步:確定臨界值(循環(huán)結(jié)束的條件),讓函數(shù)結(jié)束
第二步:找關(guān)系,假設(shè)函數(shù)的功能已經(jīng)實現(xiàn),找f()和f(n-1)的關(guān)系
第三步:根據(jù)關(guān)系,用f(n-1)實現(xiàn)f(n)的功能


# 寫一個函數(shù),實現(xiàn):1 + 2 + 3 + ... + n
def my_sum(n):
    # 1.找臨界值
    if n == 1:
        return 1
    # 2.找關(guān)系
    """
    my_sum(n) = 1 + 2 + 3 + ... + n
    my_sum(n-1) = 1 + 2 + 3 + ... + n-1
    my_sum(n) = my_sum(n-1) + n
    """
    # 3.用f(n - 1) 實現(xiàn)f(n)的功能
    return my_sum(n - 1) + n


print(my_sum(5))

用遞歸實現(xiàn)以下功能

n = 3
***
**
*

n = 4
****
***
**
*

先打印n顆星
f(n - 1)



def print_star(n):
    if n == 1:
        print('*')
        return

    print('*' * n)
    print_star(n - 1)


print_star(5)

總結(jié):遞歸甲馋,能不用就不用

作業(yè)

1.寫一個函數(shù)將一個指定的列表中的元素逆序( 如[1, 2, 3] -> [3, 2, 1])(注意:不要使 表自帶的逆序函數(shù))

def ni_xu(n):
    count = len(n) - 1
    while count >= 0:
        n.append(n[count])
        del n[count]
        count -= 1
    return n


list1 = [1, 2, 3, 4, 5]
print(ni_xu(list1))

結(jié)果


1.JPG

2.寫一個函數(shù)埂奈,提取出字符串中所有奇數(shù)位上的字符

def char_jishu(n):
    num = len(n)
    str2 = ''
    for index in range(num):
        if index % 2 == 1:
            str2 += n[index]
    return str2



str1 = 'sd45fg5hjt15uf4kyf5656¥%&*('
print(str1, '的奇數(shù)位:')
print(char_jishu(str1))

結(jié)果:


2.JPG

3.寫一個匿名函數(shù),判斷指定的年是否是閏

year = 2018
leap_year = lambda n: (n % 4 == 0 and n % 100 != 0) or n % 400 == 0
print(year, end=' ')
if leap_year(year):
    print('是閏年')
elif not leap_year(year):
    print('不是閏年')

結(jié)果:


3.JPG

4.使用遞歸打印:
n = 3的時候
@
@@@
@@@@@

n = 4的時候:
@
@@@
@@@@@
@@@@@@@

5.寫函數(shù),利用遞歸獲取斐波那契數(shù)列中的第 10 個數(shù)定躏,并將該值返回給調(diào)用者账磺。

def fino_ten(n):
    if n == 1 or n == 2:
        return 1
    return fino_ten(n - 2) + fino_ten(n - 1)


print('斐波那契數(shù)列第10個數(shù):', fino_ten(10))

結(jié)果:


8.JPG

6.寫一個函數(shù)芹敌,獲取列表中的成績的平均值,和最高分

def ave_max(n):
    sum1 = 0
    aver = 0
    max_num = 0
    for index in range(len(n)):
        sum1 += n[index]
        if index == 0:
            max_num = n[index]
        elif n[index] > max_num:
            max_num = n[index]
    aver = sum1 / len(n)
    return aver, max_num


list1 = [95, 85, 75, 98]
a, b = ave_max(list1)
print('平均分:', a, '最高分:', b)

結(jié)果:


4.JPG

7.寫函數(shù)垮抗,檢查獲取傳入列表或元組對象的所有奇數(shù)位索引對應(yīng)的元素氏捞,并將其作為新的列表返回給調(diào)用者

def my_func(n):
    list2 = []
    for index in range(len(n)):
        if index % 2:
            list2.append(n[index])
    return list2


list1 = [10, 20, 30, 40, 50, 60, 70]
tuple1 = (20, 10, 40, 50, 80, 60, 70)
print(list1, '奇數(shù)位索引:', end='')
print(my_func(list1))
print(tuple1, '奇數(shù)位索引:', end='')
print(my_func(tuple1))

結(jié)果:
![5.JPG](https://upload-images.jianshu.io/upload_images/14187175-a593f319b7b038f2.JPG?

6.JPG

imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

8.實現(xiàn)屬于自己的字典update方法:用一個字典去更新另一個字典的元素(不能使用自帶的update方法)
yt_update(字典1, 字典2)

def my_update(dict_a, dict_b):
    for key in list(dict_b):
        dict_a[key] = dict_b[key]
    return dict_a


dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'c': 3, 'a': 5, 'd': 4}
print('用', dict2)
print('去更新:', dict1)
print('新的字典:', my_update(dict1, dict2))

結(jié)果:


6.JPG

9.實現(xiàn)屬于自己的items方法:將字典轉(zhuǎn)換成列表冒版,字典中的鍵值對轉(zhuǎn)換成元祖液茎。(不能使用items方法)
yt_items(字典)
例如:{'a': 1, 'b':2, 'c':3} ---> [('a', 1), ('b', 2), ('c', 3)]

def my_item(dict1):
    new_list = []
    tuple1 = ()
    for item in dict1:
        list1 = []
        list1.append(item)
        list1.append(dict1[item])
        tuple1 = tuple(list1)
        new_list.append(tuple1)
    return new_list


dict2 = {'a': 1, 'b': 2, 'c': 3}
print('轉(zhuǎn)換前:', dict2)
print(my_item(dict2))

結(jié)果:


7.JPG
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辞嗡,隨后出現(xiàn)的幾起案子捆等,更是在濱河造成了極大的恐慌,老刑警劉巖欲间,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楚里,死亡現(xiàn)場離奇詭異,居然都是意外死亡猎贴,警方通過查閱死者的電腦和手機班缎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來她渴,“玉大人达址,你說我怎么就攤上這事〕煤模” “怎么了沉唠?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苛败。 經(jīng)常有香客問我满葛,道長,這世上最難降的妖魔是什么罢屈? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任嘀韧,我火速辦了婚禮,結(jié)果婚禮上缠捌,老公的妹妹穿的比我還像新娘锄贷。我一直安慰自己,他們只是感情好曼月,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布谊却。 她就那樣靜靜地躺著,像睡著了一般哑芹。 火紅的嫁衣襯著肌膚如雪炎辨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天绩衷,我揣著相機與錄音蹦魔,去河邊找鬼激率。 笑死,一個胖子當著我的面吹牛勿决,可吹牛的內(nèi)容都是我干的乒躺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼低缩,長吁一口氣:“原來是場噩夢啊……” “哼嘉冒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咆繁,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤讳推,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后玩般,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體银觅,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年坏为,在試婚紗的時候發(fā)現(xiàn)自己被綠了究驴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡匀伏,死狀恐怖洒忧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布忍啤,位于F島的核電站,受9級特大地震影響蛉抓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剃诅,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一芝雪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧综苔,春花似錦、人聲如沸位岔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抒抬。三九已至杨刨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擦剑,已是汗流浹背妖胀。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工芥颈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赚抡。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓爬坑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涂臣。 傳聞我的和親對象是個殘疾皇子盾计,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

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

  • 一·、回顧函數(shù)基礎(chǔ) 1.函數(shù)的聲明 def 函數(shù)名(參數(shù)1:類型1, 參數(shù)2:類型2...) ->返回值類型:函數(shù)...
    龍神海王閱讀 193評論 0 0
  • 一赁遗、recode ---------# import randomfrom random import randi...
    大漠判官1閱讀 402評論 0 1
  • 一署辉、匿名函數(shù) 1.普通函數(shù) def 函數(shù)名(參數(shù)列表):函數(shù)體 2.匿名函數(shù) 函數(shù)名 = lambda 參數(shù)列表:...
    xdxh閱讀 355評論 0 0
  • 1.補充不定長參數(shù)(面試題) 補充:不定長參數(shù)(面試題)一個‘’星號“”參數(shù)名:(一個是傳位置參數(shù))將位置參數(shù)作為...
    PythonLi閱讀 195評論 0 0
  • 實話說,我們真的知道自己是什么樣子的嗎岩四? 前兩天看了一篇文章哭尝,說大多數(shù)人照鏡子看見自己的樣子,和別人看到的需要打個...
    阿喜瑪雅閱讀 967評論 2 0