2018-07-25 day08

函数的返回值

1. 函数的返回值:

  • a. 函数返回给调用者的值
  • b. return关键字后面的表达式的值
  • c. 函数调用表达式的值

python每个函数都有返回值,返回值就是return后面的值,如果没有返回值,那么返回值就是None

1. return关键字

  • a.将return后面的值返回给表达式
  • b.结束函数

2. 函数调用表达式:

python中每个函数调用表达式都有值

def fun1():
    print('aaa')


a = fun1()  # 函数调用表达式
print(a, fun1())


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


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

case: 写个函数,判断指定的年龄是否属于成年人,返回结果

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


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

3. 函数的结束

  • a.函数体执行完
  • b.遇到return
def fun3():
    print('123')
    return 1
    print('666')


fun3()

case:写一个函数,下载指定地址敌营的数据

def download(url):
    判断是否有网络
    if 没有网:
        return None
    网络请求
    请求数据
    保存数据


case: 一个函数 求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中函数可以有多个返回值,用逗号隔开,以元组类型返回
        sum1 += i
        i += 1


print(getSum())

函数的作用域

  • 作用域:一个变量可以使用的范围,就是这个变量的作用域(函数和类可以影响变量的作用域)
  • 全局变量:从声明开始,到文件结束都可以使用
  • 局部变量:在函数(类)中声明的变量是局部变量.作用域是声明开始到函数结束

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)  # 不可调用,报错 NameError: name 'aaa' is not defined

3.global / nonlocal

  • global: 在函数中创建全局变量或者声明使用的是全局变量
  • 格式:
global 变量名
变量名 = value
abc = 'abc'  # 全局变量
bbb  = 'bbb'
def fun4():
    abc = 'aaa'  # 声明了一个局部变量叫abc,不会互相影响,函数体内优先使用局部变量
    global bbb  # 声明使用全局变量 bbb  如果前面没有声明则新声明一个
    bbb = 100
    print(abc, bbb)
fun4()
print(abc, bbb)

case: 声明一个变量统计函数调用的次数

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

fun5()
fun5()
print(count)

# nonlocal

def fun6():
    a1 = 10
    print(a1)
    # python中函数里面可以声明函数  只能在该函数体中调用 外部无法调用
    def fun61():
        nonlocal a1
        a1 = 100
        print('333')
    fun61()
    print(a1)
fun6()

匿名函数

  • 匿名函数: 本质还是函数,以另一种简单方式来声明
  • 匿名函数的声明:
函数名 = lambda 参数列表 : 返回值  →  结果是一个函数变量
  • lambda: 声明匿名函数的关键字

case: 写一个函数计算两个数的和

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

函数变量

声明一个函数就是再声明一个变量.函数名可以当成变量来使用,可以打印 可以赋值/查看类型/作为参数/作为返回值

a = 'a'
print(a)


# 函数名fun1可以当成变量使用
def fun1(a):
    print(a)
    return 10


print(fun1, type(fun1))

# 将函数fun1赋给变量a,这个时候a就是一个函数
a = fun1
b = fun1(10) + 100
a('aaa')
# 将函数fun1作为列表的元素
fun2 = [fun1]
fun2[0]('aaaa')

1.将函数作为参数

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整个表达式的结果是'值1',否则是'值2'
res = operation(getSum, 1, 2, 3, 4, 5, 6)
# 判断10是否大于20
# res = operation(lambda x, y: x > y, 10, 20)
# 判断两个数谁大
# res = operation(lambda x, y: x if x > y else y, 10, 20)
print(res)

3.将函数作为函数的返回值

case: 一个函数有个参数,要求传入一个运算符号(+,-,*,/,<,>),返回符号对应的功能 + → 求和功能

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.什么是递归

  • 递归函数:在函数体中调用函数本身
  • 一切循环皆可递归
  • 对递归的要求:能不用就不用
  • 函数调用的过程是一个压栈的过程(每调用一次函数,系统都要为其分配内存空间,用来存储函数中声明的变量和参数等,这个内存再函数调用结束后会自动销毁)

2.怎么写递归函数

  • a.找出临界值(跳出递归 → return)
  • b.找关系:假设当前函数对应的功能已经实现,找到f(n)和f(n-1)的关系
  • c.使用f(n-1)与f(n)的关系来实现f(n)的功能
# 递归示例

def fun1():
    fun1()


fun1()

case: 写一个递归实现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是偶数)

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


print(getMul(5))

case: 递归实现以下

'''
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)

作业

1.写⼀个函数将⼀个指定的列表中的元素逆序(例如[1, 2, 3] -> [3, 2, 1])(注意:不要使⽤列表⾃带的逆序函数)

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

2.写⼀个函数,提取出字符串中所有奇数位上的字符

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

3.写⼀个匿名函数,判断指定的年是否是闰年

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的参数
    '''
    if n == 1:
        print(' ' * (space) + '@' * (2 * n - 1))
    else:
        printSign(n - 1, space + 1)
        print(' ' * (space) + '@' * (2 * n - 1))


printSign(3)

5.写函数,检查传⼊列表的⻓度,如果⼤于2,那么仅保留前两个⻓度的内容,并将新内容返回给调⽤者。

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.写函数,利⽤递归获取斐波那契数列中的第 10 个数,并将该值返回给调⽤者。

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.写⼀个函数,获取列表中的成绩的平均值,和最⾼分

"""递归版调试中
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.写函数,检查获取传⼊列表或元组对象的所有奇数位索引对应的元素,并将其作为新的列表返回给调用者

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]))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容