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]))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容