day_007 Python中的函数相关内容

一、返回值

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

  • python中每个函数都是有返回值的,返回值就是return后面的值。如果没有return,则返回值为None。

  • 函数的调用:
    a.先回到函数声明的位置
    b.用实参给形参赋值(传参)
    c.执行函数体
    d.执行完函数体,将返回值返回给函数调用表达式
    e.回到函数调用的位置
    函数的函数体只有在调用后才会执行

  • return关键字:
    a.将return后面的值返回给函数调用表达式
    b.结束函数

  • 函数的结束:
    a.函数体执行完成
    b.遇到return

  • 函数调用表达式:
    python中每个函数调用表达式都是有值的

# 声明函数
def func1():
    print('lkjf')

# 调用函数  函数表达式
value1 = func1()
print(value1)

def func2(a, b):
    return a + b

print(func2(1, 2))

示例:

# 练习:写一个函数,判断指定的年龄是否属于成年

def adult_tell(age):
    if age<0:
        return '请输入正确的年龄!'
    if age>=18:
        return '成年人'
    if age<18:
        return '未成年'

age = int(input('请输入年龄:'))

print(adult_tell(age))

结果:

请输入年龄:20
成年人

练习:写一个函数,求1+2+3+...+n,和不能大于10000

def func3():
    sum1 = 0
    num1 = 1
    while True:
        if sum1 + num1 >= 10000:
            # python中函数可以有多个返回值,返回多个值时值为元组
            return sum1, num1-1
        sum1 += num1
        num1 += 1

print(func3())

结果:

(9870, 140)

二、作用域

  • 作用域:一个变量可以使用的范围,就是这个变量的作用域(函数和类可以影响作用域)

  • 全局变量:从声明开始,到文件结束都可以使用
    特殊的,在Python中的for循环中声明的变量也是全局变量

  • 局部变量:在函数和类中声明的变量。作用域是从声明开始到函数结束

全局变量

# 全局变量
a = 10

print(a)

def func1():
    print(a)

func1()

for _ in range(4):
    # 特殊的,在Python中的for循环中声明的变量也是全局变量
    b = 100
    print(a)

print('-'*20)
print(b)

def func2():
    print(b)

func2()
print('-'*20)

结果:

10
10
10
10
10
10
--------------------
100
100
--------------------

局部变量

# 局部变量
def func3():
    # 局部变量,作用域在函数内
    c = 200

global

"""
global 变量1:在函数中声明 变量1 是一个全局变量
格式:
global 变量名
变量名 = 值
"""

# 全局变量
d = 'd'
e = 'e'
def func4():
    # 局部变量
    d = 'b'
    print(d)

    # 说明e是一个全局变量
    global e
    e = 'E'
    print(e)

func4()
print(d)
print(e)
print('-'*20)

结果:

b
E
d
E

nonlocal

"""
nonlocal:在函数中声明函数的时候,才需要使用
"""

def func11():
    a_11 = 10

    print('外部',a_11)

    # python中函数里面可以声明函数
    def func12():
        nonlocal a_11
        a_11 = 100
        print('内部', a_11)

    func12()
    print('外部', a_11)

func11()

结果:

外部 10
内部 100
外部 100

三、匿名参数

  • 匿名函数:本质还是函数,以另外一种简单的方式来声明

  • 匿名函数的声明:
    变量名 = lambda 参数列表:返回值 ---- 结果是一个函数变量

  • lambda: 声明匿名函数的关键字

# 写一个函数,计算2个数的和
# 一般函数
def my_sum1(a, b):
    return a+b

print(my_sum1(10, 20))

# 匿名函数
my_sum2 = lambda a, b: a+b

print(my_sum2(10, 20))

结果:

30
30

示例:

"""
i = (0, 1, 2, 3, 4)
i = 0
funcs = [lambda x:x*0]
i = 1
funcs = [lambda x:x*1, lambda x:x*1]
···
i = 4
funcs = [lambda x:x*4, lambda x:x*4, lambda x:x*4, lambda x:x*4]
"""
#
funcs = []
for i in range(5):
    # i是全局变量
    funcs.append(lambda x:x*i)

print(funcs[2](2))
print(funcs[4](2))
print(i)

结果:

8
8
4

四、函数变量

  • 声明一个函数就是在声明一个变量。函数名可以当成变量来使用。可以打印、赋值、查看类型、作为函数的参数,可以作为函数的返回值。
a = 10
a = 'a'
print(a)

def func1(a):
    print(a)
    return 100

print(func1, type(func1))
print('-'*20)

结果:

a
<function func1 at 0x000002002C5AD1E0> <class 'function'>

将函数func1赋给b,这个时候b就是一个函数了

b = func1
b(10)
print(b)

print('-'*20)

c = func1(10)
print(func1(10))

结果:

10
<function func1 at 0x000002002C5AD1E0>
--------------------
10
10
100

将函数func1作为列表的元素

functions = [func1]
functions[0]('啊啊啊')

结果:

啊啊啊

将函数作为参数

def my_sum(*numbers):
    sum1 = 0
    for item in numbers:
        sum1 += item
    return sum1

def my_mul(*numbers):
    sum1 = 1
    for item in numbers:
        sum1 *= item
    return sum1

def operation(method, x, y):
    """
    method = my_sum
    x, y = 1, 2
    return = my_sum(numbers)
    :param method: function
    :param numers: tuple
    :return:
    """
    return method(x, y)

result1 = operation(my_sum, 1, 2)
print(result1)
result2 = operation(my_mul, 2, 3)
print(result2)
result3 = operation(lambda x,y:x>y, 10, 11)
print(result3)

结果:

3
6
False
20

在c中有三目运算符:
表达式?值1:值2
在Python中相同功能的方法是:
值1 if 表达式 else 值2 ---- 判断表达式是否为True,为True整个表达式是值1,否则为值2

print(10 if 10>20 else 20)

结果:

20

将函数作为函数的返回值

def get_method(char):
    if char == '+':
        return lambda x,y:x+y
    elif char == '*':
        return lambda x,y:x*y
    elif char == '>':
        def func1(x, y):
            return x > y
        return func1
    else:
        def func(x, y):
            return None
        return func


print(get_method('+')(2, 3))
print(get_method('*')(2, 3))

结果:

5
6

五、递归

  • 递归函数:在函数的函数体中调用自己

  • 循环能做的事情递归都可以做。

  • 怎么写一个递归函数
    a.找临界值(跳出循环 ---- return)
    b.找关系:假设当前对应的功能已经实现,找到f(n)和f(n-1)的关系
    c.通过使用f(n-1)与b中的关系去实现f(n)的功能

  • 对递归的要求:能不用就不用

  • 函数调用的过程是一个压栈的过程(每调用一次函数,系统都要为其分配内存空间,用来存储函数中声明的变量和函数等,这个内存在函数调用结束后会自动销毁)

写一个函数实现:1+2+3+···+n

def recursion_sum(n):
    # 找到临界值
    if n == 1:
        return 1
    # 找到my_sum1(n)和my_sum1(n-1)的关系
    """
    my_sum(n) = 1+2+3+···+n-1+n
    my_sum(n-1) = 1+2+3+···+n-1
    my_sum(n) = my_sum(n-1)+n
    
    """
    return recursion_sum(n-1)+n

print(recursion_sum(10))

结果:

55

用递归求246···n(n是偶数)

def recursion_mul(n):
    if n%2:
        print('参数错误!')
        return
    if n==2:
        return 2
    else:
        return recursion_mul(n-2)*n

print(recursion_mul(6))

结果:

48

用递归实现以下功能
n = 3

***
**
*

n = 4

****
***
**
*

关系:先打印n个*,在打印f(n-1)

def recursion_print(n):
    if n == 1:
        print('*')
        return
    else:
        print('*'*n)
        return recursion_print(n-1)

recursion_print(5)

结果:

*****
****
***
**
*

反向的

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

print_star(5)

结果:

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

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,145评论 0 13
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,788评论 0 38
  • 今天是十个身体的第17天/总第617天(20180411):感受到呼吸的流畅,每天都很享受体式在呼吸中的自动发生。...
    长腿蟹1979阅读 615评论 0 0
  • 说句实话,直到现在也没有真正领会什么是太极,中国智慧博大精深,我也未必能参透其中,虽然通过百度去了解它,但也...
    立立红朵阅读 500评论 1 1
  • 我最近身边出现了两圈女神。 第一圈,我周六的时候在D.C.见到了女神Ruth Ginsburg。作为民权运动和妇女...
    生如如花阅读 164评论 0 0