2018-07-25 day08

函數(shù)的返回值

1. 函數(shù)的返回值:

  • a. 函數(shù)返回給調(diào)用者的值
  • b. return關(guān)鍵字后面的表達式的值
  • c. 函數(shù)調(diào)用表達式的值

python每個函數(shù)都有返回值,返回值就是return后面的值,如果沒有返回值,那么返回值就是None

1. return關(guān)鍵字

  • a.將return后面的值返回給表達式
  • b.結(jié)束函數(shù)

2. 函數(shù)調(diào)用表達式:

python中每個函數(shù)調(diào)用表達式都有值

def fun1():
    print('aaa')


a = fun1()  # 函數(shù)調(diào)用表達式
print(a, fun1())


def fun2(x, y):
    print('bbb')
    return x + y


num = fun2(1, 3)
print(fun2(1, 5))

case: 寫個函數(shù),判斷指定的年齡是否屬于成年人,返回結(jié)果

def isAdult(n):
    
    :type n: int
    :rtype: bool
    
    if n >= 18:
        return True
    return False


if isAdult(20):
    print('成年')
else:
    print('未成年')

3. 函數(shù)的結(jié)束

  • a.函數(shù)體執(zhí)行完
  • b.遇到return
def fun3():
    print('123')
    return 1
    print('666')


fun3()

case:寫一個函數(shù),下載指定地址敵營的數(shù)據(jù)

def download(url):
    判斷是否有網(wǎng)絡
    if 沒有網(wǎng):
        return None
    網(wǎng)絡請求
    請求數(shù)據(jù)
    保存數(shù)據(jù)


case: 一個函數(shù) 求1+2+3+...,和不能大于10000

def getSum():
    i = 0
    sum1 = 0
    while True:
        if sum1 + i >= 10000:  # 如果sum1 下一次加上i大于10000,則返回 i-1
            return i - 1, sum1  # python中函數(shù)可以有多個返回值,用逗號隔開,以元組類型返回
        sum1 += i
        i += 1


print(getSum())

函數(shù)的作用域

  • 作用域:一個變量可以使用的范圍,就是這個變量的作用域(函數(shù)和類可以影響變量的作用域)
  • 全局變量:從聲明開始,到文件結(jié)束都可以使用
  • 局部變量:在函數(shù)(類)中聲明的變量是局部變量.作用域是聲明開始到函數(shù)結(jié)束

1.全局變量

a = 10  # 全局變量
print(a)
def fun1(a):
    print(a)
for _ in range(3):
    b = 20  # 全局變量
    print(a)
print(b)
def fun2():
    print(b)
fun2()

2.局部變量

def fun3():
    aaa = 2  # 局部變量
# print(aaa)  # 不可調(diào)用,報錯 NameError: name 'aaa' is not defined

3.global / nonlocal

  • global: 在函數(shù)中創(chuàng)建全局變量或者聲明使用的是全局變量
  • 格式:
global 變量名
變量名 = value
abc = 'abc'  # 全局變量
bbb  = 'bbb'
def fun4():
    abc = 'aaa'  # 聲明了一個局部變量叫abc,不會互相影響,函數(shù)體內(nèi)優(yōu)先使用局部變量
    global bbb  # 聲明使用全局變量 bbb  如果前面沒有聲明則新聲明一個
    bbb = 100
    print(abc, bbb)
fun4()
print(abc, bbb)

case: 聲明一個變量統(tǒng)計函數(shù)調(diào)用的次數(shù)

# global
count = 0
def fun5():
    global count
    count += 1

fun5()
fun5()
print(count)

# nonlocal

def fun6():
    a1 = 10
    print(a1)
    # python中函數(shù)里面可以聲明函數(shù)  只能在該函數(shù)體中調(diào)用 外部無法調(diào)用
    def fun61():
        nonlocal a1
        a1 = 100
        print('333')
    fun61()
    print(a1)
fun6()

匿名函數(shù)

  • 匿名函數(shù): 本質(zhì)還是函數(shù),以另一種簡單方式來聲明
  • 匿名函數(shù)的聲明:
函數(shù)名 = lambda 參數(shù)列表 : 返回值  →  結(jié)果是一個函數(shù)變量
  • lambda: 聲明匿名函數(shù)的關(guān)鍵字

case: 寫一個函數(shù)計算兩個數(shù)的和

def sum1(x, y):
    return x + y
print(sum1(3, 6))
sum2 = lambda x, y: x + y
print(sum2(6, 3))

函數(shù)變量

聲明一個函數(shù)就是再聲明一個變量.函數(shù)名可以當成變量來使用,可以打印 可以賦值/查看類型/作為參數(shù)/作為返回值

a = 'a'
print(a)


# 函數(shù)名fun1可以當成變量使用
def fun1(a):
    print(a)
    return 10


print(fun1, type(fun1))

# 將函數(shù)fun1賦給變量a,這個時候a就是一個函數(shù)
a = fun1
b = fun1(10) + 100
a('aaa')
# 將函數(shù)fun1作為列表的元素
fun2 = [fun1]
fun2[0]('aaaa')

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

def getSum(num):
    sum1 = 0
    for i in num:
        sum1 += i
    return sum1


def getMul(*num):
    mul = 1
    for i in num:
        mul *= i
    return mul


def operation(method, *num):
    return method(num)

相當于三目運算符

  • 值1 if 條件 else 值2 → 判斷表達式是否為true,為true整個表達式的結(jié)果是'值1',否則是'值2'
res = operation(getSum, 1, 2, 3, 4, 5, 6)
# 判斷10是否大于20
# res = operation(lambda x, y: x > y, 10, 20)
# 判斷兩個數(shù)誰大
# res = operation(lambda x, y: x if x > y else y, 10, 20)
print(res)

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

case: 一個函數(shù)有個參數(shù),要求傳入一個運算符號(+,-,*,/,<,>),返回符號對應的功能 + → 求和功能

def getMethod(char):
    if char == '+':
        return lambda x, y: x + y
    elif char == '-':
        return lambda x, y: x - y
    elif char == '*':
        return lambda x, y: x * y
    elif char == '/':
        return lambda x, y: x / y
    elif char == '<':

        def fun(x, y):
            return x < y

        return fun
    elif char == '>':

        def fun(x, y):
            return x > y

        return fun

    else:
        def fun(*num):
            return None
        return fun


print(getMethod('-')(10, 20))
print(getMethod('+')(10, 20))
print(getMethod('*')(10, 20))
print(getMethod('/')(10, 20))
print(getMethod('<')(10, 20))
print(getMethod('>')(10, 20))
print(getMethod('?')(10, 20))

遞歸

1.什么是遞歸

  • 遞歸函數(shù):在函數(shù)體中調(diào)用函數(shù)本身
  • 一切循環(huán)皆可遞歸
  • 對遞歸的要求:能不用就不用
  • 函數(shù)調(diào)用的過程是一個壓棧的過程(每調(diào)用一次函數(shù),系統(tǒng)都要為其分配內(nèi)存空間,用來存儲函數(shù)中聲明的變量和參數(shù)等,這個內(nèi)存再函數(shù)調(diào)用結(jié)束后會自動銷毀)

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

  • a.找出臨界值(跳出遞歸 → return)
  • b.找關(guān)系:假設當前函數(shù)對應的功能已經(jīng)實現(xiàn),找到f(n)和f(n-1)的關(guān)系
  • c.使用f(n-1)與f(n)的關(guān)系來實現(xiàn)f(n)的功能
# 遞歸示例

def fun1():
    fun1()


fun1()

case: 寫一個遞歸實現(xiàn)1+2+3...+n

def getSum(n):
    if n == 1:
        return 1
    else:
        return getSum(n - 1) + n


print(getSum(10))
'''
getSum(n)
getSum(5): getSUm(4) + 5
getSum(4): getSUm(3) + 4
getSum(3): getSUm(2) + 3
getSum(2): getSUm(1) + 2
getSum(1): return 1
'''

case: 遞歸求246...n(n是偶數(shù))

def getMul(n):
    if not n % 2:
        if n == 2:
            return 2
        else:
            return getMul(n - 2) * n


print(getMul(5))

case: 遞歸實現(xiàn)以下

'''
n = 3
***
**
*
n = 4 
****
***
**
*
'''


def printStar(a):
    if a == 1:
        print('*')
        return 0
    else:
        print('*'*a)
        printStar(a-1)


# printStar(3)

def printStar2(a):
    if a == 1:
        print('*')
        return 0
    else:
        printStar2(a-1)
        print('*'*a)


printStar2(3)

作業(yè)

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

def backdrop(list1):
    list2 = []
    for i in range(0 - len(list1), 0):
        list2.append(list1[i])
    return list2

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

def getOddAlpht(str1):
    str2 = 2
    for i in range(len(str1)):
        if i % 2:
            str2 += str1[i]
    return str2

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

a = lambda n: bool(((not n % 4) and (n % 100))or(not n % 400))
print(lambda n: bool(((not n % 4) and (n % 100))or(not n % 400))(2011))

4.使?遞歸打印:

1.png
def printSign(n, space=0):

    '''
    :type n:int
    :type space:int
    :rtype:None
    print(' ' * ? + '@' * (2 * n - 1))
    n = 5 時
    print(' ' * 0 + '@' * (2 * 5 - 1))
    print(' ' * 1 + '@' * (2 * 4 - 1))
    print(' ' * 2 + '@' * (2 * 3 - 1))
    print(' ' * 3 + '@' * (2 * 2 - 1))
    print(' ' * 4 + '@' * (2 * 1 - 1))
    所以考慮增加一個默認值為0的參數(shù)
    '''
    if n == 1:
        print(' ' * (space) + '@' * (2 * n - 1))
    else:
        printSign(n - 1, space + 1)
        print(' ' * (space) + '@' * (2 * n - 1))


printSign(3)

5.寫函數(shù),檢查傳?列表的?度,如果?于2,那么僅保留前兩個?度的內(nèi)容,并將新內(nèi)容返回給調(diào)?者。

def getBoth(list1):
    '''
    :type list1:list
    :rtype:list
    '''
    if len(list1) <= 2:
        return list1
    else:
        del list1[len(list1) - 1]
        getBoth(list1)
        return list1


print(getBoth([1, 2, 3, 4, 5, 6]))

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

def getFibonacci10th(n1=1, n2=0, count=0):
    '''
    rtype:int
    1       1       n1 = 1  n2 = 0  fn = n1+n2
    2       1       n1 = n2 n2 = fn fn = n1+n2
    3       2       n1 = n2 n2 = fn fn = n1+n2
    4       3       n1 = n2 n2 = fn fn = n1+n2
    5       5       n1 = n2 n2 = fn fn = n1+n2
    6       8       n1 = n2 n2 = fn fn = n1+n2
    7       13      n1 = n2 n2 = fn fn = n1+n2
    8       21      n1 = n2 n2 = fn fn = n1+n2
    9       34      n1 = n2 n2 = fn fn = n1+n2
    10      55      n1 = n2 n2 = fn fn = n1+n2
    '''
    if count == 9:
        n1 = 1
        n2 = 0
        fn = n1 + n2
        return n1, n2, fn
    else:
        count += 1
        n1, n2, fn = getFibonacci10th(n1, n2, count)
        n1 = n2
        n2 = fn
        fn = n1 + n2
        return n1, n2, fn


_, _, fn = getFibonacci10th()
print(fn)

7.寫?個函數(shù),獲取列表中的成績的平均值,和最?分

"""遞歸版調(diào)試中
def getScore(list2, i=0):
    '''
    0       4
    1       5
    2       6
    3       1
    4       2
    5       3
    '''
    max1 = list2[0]
    if i == len(list2) - 1:
        return list2[i]
    else:
        sum1 = 0
        i += 1
        if max1 > list2[i]:
            max1 = list2[i]
        sum1 += getScore(list2, i)
        return sum1 / len(list2), max1


avg, max1 = getScore([4, 5, 6, 1, 2, 3])
"""


def getScore(list2):
    max1 = list2[0]
    sum1 = 0
    for i in list2:
        sum1 += i
        if max1 < i:
            max1 = i
    return max1, sum1 / len(list2)


max1, avg = getScore([4, 5, 6, 1, 2, 3])
print('平均值:', avg, '最大值:', max1)

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

def getNewList(kwargs):
'''
:type kwargs:tuple/list
:rtype:list
'''
    list3 = []
    for index in range(len(kwargs)):
        if index % 2:
            list3.append(kwargs[index])
    return list3


print(getNewList([1, 2, 3, 4, 5, 6]))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

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