函数二

函数

自定义函数
函数的参数
函数的返回值
函数的作用域
函数介绍

函数的返回值介绍

当两个函数之间,想要互相使用内部变量时,就可以应用到函数的返回值

函数的返回值定义

  • 使用 return 关键字返回内容
  • 内容 返回到 函数调用处
  • 函数体中没有 return 语句时,函数运行结束,
    默认返回 None , 也被称为隐含返回值
image.png

小栗子:
摄氏度与华氏度关系如:摄氏度/1.8 + 32 = 华氏度
需求:
定义函数1:用于输出摄氏度
定义函数2:通过摄氏度计算得出华氏度

  • 使用 return 关键字返回内容
  • 将内容 返回到 函数调用处
  • 函数体中没有 return 语句时,函数运行结束,
    则默认返回 None , 也被称为隐含返回值
# 定义摄氏度函数
def c_temp():
     c_t = 14
     print(f'今天的摄氏度:{c_t}')
     # 如果不做任何返回,默认返回值为None
     # 将c_t返回到改函数的调用处
     return c_t


# 调用华氏度
def f_temp(c_t):
     f_t = round(c_t / 18 + 32)
     print(f'今天的华氏度:{f_t}')


if __name__ == '__main__':
     c_t_two = c_temp()
     f_temp(c_t_two) 

函数多个返回值

  • 当执行函数体内代码时,遇到第一个 return 就将指定值返回到函数调用处,也就是执行到
    return这行代码,后面的都不执行了。
  • 多个返回值时,用逗号隔开,但默认为元组
image.png
def test_one():
     a, b, c = (1, 2, 3)

     # 函数当中有多个return不会报错,但是只执行第一个
     # return a
     # return b
     # return c
     
     # 相当于a,b,c打包返回,元组
     return a, b, c


# res = test_one()
# print(res)          # (1, 2, 3)

a, b, c  =test_one()  # 拆包
print(a)              # 1
print(b)              # 2
print(c)              # 3

函数作用域介绍

Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值
的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python 的作用域一共有4种,
分别是:

  • L(local):局部作用域,即函数中定义的变量;
  • E(enclosing):嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是
    全局的;
  • G(global):全局变量,就是模块级别定义的变量;
  • B(build-in):内建作用域,系统固定模块里面的变量,比如:int()等;
"""
注意: if判断,循环控制是没有作用域的概念。
"""
if True:
     a = 5

print(a)       # 5

for i in range(3):
     print('hello')

print(i)
def test_one():
     # 局部变量,该变量的作用域在函数体内部
     a = 5
     return a


print(222, a)            # 报错
print(test_one())        # 5
# 全局变量
a = 100


def test_one():
     print(f'a={a}')     # 在局部没有时,则取全局变量中找。100


def test_two():
     a = 200             # 局部变量
     print(f'a={a}')     # 当局部有该变量时,则优先局部的,200


test_one()               # a = 100
test_two()               # a = 200

global 关键字

当我们需要在函数内部直接修改全局变量时,我们可以将函数内部的局部变量通过 global 关键字声
明为全局变量

# global
a = 100


def test_one():
     print(f'a = {a}')    # 10


def test_two():
     # a = 20              # 方案一:初始化一个局部变量
     # 方案二:局部变量-->全局变量
     global a
     a = a +10
     print(f"a = {a}")


test_one()                 # a = 100               
test_two()                 # a = 110

函数作用域的优先级

image.png
# built-in 只要在python环境中即可使用,了解,
# int()

# global
a = 11


def outer():
     b = 5     # enclosing

     def inner():
          # nonlocal 是将local声明为enclosing
          nonlocal b
          b = 6     # local
          print(b)


     inner()


outer()
"""
1. 代码从上至下执行
2.函数只有调用的时候才会执行
3.函数执行完毕,则返回函数的调用处
"""


def test():
     print('--5--')
     
     
def test2():
     print("--3--")
     test()
     print('--4--')
     
     
def test3():
     print('--1--')
     test2()
     print('--2--')
     
     
# 1 3 5 4 2
test3()

递归函数

递归的介绍
函数Func(args)直接或间接 调用函数本身,则该函数称为 递归函数

小栗子:
阶乘本质:n! = 1 * 2 * 3 * ... * n
使用递归函数实现阶乘

# 实现阶乘
# n! = 1*2*3*...*n
# 3! = 1 * 2 * 3


i = 1
res_nums = 1
while i <= 3:
     res_nums *= i
     i += 1
print(f'3! = {res_nums}')

递归函数

注意

  • 递归函数自身没有结束条件,所以需要我们自己设置结束条件,终止函数的调用。
  • 可以使用递归实现的循环都可以实现,并且递归效率很低,所以递归很少使用
# 使用递归实现,在函数内部调用自己
# 递归没有结束条件,一定要自己设定结束条件
# 能够用递归实现,都可以用循环实现,递归效率低所以很少使用
def get_nums(num):
     if num > 1:
          return num * get_nums(num-1)
     else:
          return 1


res = get_nums(3)
print(res)
# 阶乘实现:1.循环 2.递归 3.reduce
# functools是内置的模块,所以不需要pip安装

from functools import reduce


def multi(x, y):
     return x * y

# 相当于1,2先传入到multi中,在进行乘积返回,在将该结果于3传进入进行乘积返回...依次往后
# 注意:是两两传入
print(reduce(multi, range(1 ,4)))    

内置文件中常用方法

image.png

zip()
zip()用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组
成的列表。

image.png
image.png
image.png

内置文件中常用方法

实现: 返回1-10的奇数列表
实现 : 阶乘,比如n!=123...n

 方法一:
li = []
for i in range(1, 11):
     if i % 2 == 1:
          li.append(i)

print(li)

# 方法二:
li = []
for i in range(1, 11, 2):
     li.append(i)
print(li)
# 方法三:

def is_odd(n):
     # 布尔值,不管bool值为True还是False,都会返回出去。是filter做了过滤操作。
     return n % 2 ==1


# filter函数,将range(1,11)中每个元素传到is_odd方法中进行条件判断,将结果为True的构建新的filter对象
print(list(filter(is_odd, range(1, 11))))

匿名函数

匿名函数介绍
当我们在传入函数时,有些时候,****不需要重复调用该函数***,直接传入匿名函数更方便,也无需担心
函数名冲突,并且还可以将匿名函数赋值给一个变量,再利用变量来调用该函数。

image.png
# 自定义函数
def f(x):
    return x * x


print(f(3))             # 9


# lambda 形参:返回值
f = lambda x, y: x * y
print(f(2, 5))          # 10
image.png
# 匿名函数最为返回值
def fx(i, j):
    # 返回匿名函数
    return lambda :i*j


f = fx(6, 6)    # lambda:i*j
print(f())   # 函数只有调用时才会执行

image.png
# 匿名函数作为实参
def test(a, b, func):
    res = func(a, b)    # 11 + 22
    return res


nums = test(11, 22, lambda a,b:a+b)
print(nums)             # 33

小栗子
将 lis = [4,-2,3,1] --> [1,-2,3,4]
infors = [{'name':'qian','age':28},{'name':'amy','age':20},{'name':'james','age':25}]
以 name 对应的值进行排序

# [4, -2, 3, 1]-->[1, -2, 3 4]
# [4,2,3,1] --> [1,2,3,4] --> [1,-2,3,4]
li = [4, -2, 3, 1]

# key:指定排序规则,排序之后返回原元素
li.sort(key=abs)
print(li)
"""
infors = [{'name':'qian','age':28},{'name':'amy','age':20},{'name':'james','age':25}]
以 name 对应的值进行排序
"""

infors = [{'name':'qian','age':28},{'name':'amy','age':20},{'name':'james','age':25}]

# key: 排序键-->获取到每个字典当中name的值。如何获取,时应为infors列表中的每个元素(字典)
# 他作为实参传入x,但是因为,我们需要按照字典当中的name的值取排序,所以应当返回x['name']
infors.sort(key=lambda x: x['name'])
print(infors)

高阶函数

高阶函数需满足条件:

  • 函数名 作为 参数传入
  • 函数名 作为 返回值
image.png
# '''
# ü 作业 1
# 1. 定义一个函数 完成用户输入的三个数字的求和
# 以及在另一个函数求该和的平均值 ( 用到函数传参 , 函数返回值
# '''
# 
# # 定义求和函数
# def get_sum(num_a, num_b, num_c):
#     return num_a + num_b + num_c
# 
# 
# # 定义求平均值的函数
# def get_avg(num_sums, len_li):
#     num_avg = round(num_sums / len_li, 2)
#     print(f'和为:{num_sums}\n均值为:{num_avg}')
# 
# 
# if __name__ == '__main__':
#     ipt_li = tuple(map(float, input('请输入:'.split())))
#     num_sums = get_sum(*ipt_li)
#     get_avg(num_sums, len(ipt_li))
image.png
"""
ü 作业 2
2. 将列表 l 输出如下。 l = ["jack",("tom",23),"rose",(14,55,67)]
提示 : 用递归实现
"""
l = ["jack",("tom",23),"rose",(14,55,67)]

# 如果遇到的是'jack' 'rose' 就直接输出
# 如果遇到的(,)就去遍历


# 方法一
def get_ele(l):
    for item in l:
        # isintance(x, A_tuple)判断x是否时A_tuple的类型
        if isinstance(item, tuple):
            get_ele(item)
        else:
            print(item)


get_ele(l)


# 方法二
def get_ele(l):
    # 判断l时整数或者字符串
    if isinstance(l, (int,str)):
        print(l)
    else:
        for item in l:
            get_ele(item)


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

推荐阅读更多精彩内容

  • 1.函数的返回值 返回值就是函数执行以后返回的结果 通过return来指定函数的返回值 renturn后面可以跟任...
    止于枯骨1阅读 226评论 0 0
  • 1、函数的返回值 函数返回值就是函数执行之后返回的结果 通过return来指定函数的返回值,return后面就是函...
    极影客阅读 394评论 0 0
  • 一、函数的返回值 返回值就是函数执行以后的返回的结果!可以通过return用来结束函数(循环也会结束),不管后面还...
    斜雨耀眼5891阅读 129评论 0 0
  • 1.函数的返回值 返回值就是函数执行完之后返回的结果 通过return来指定函数的返回值 return后面可以跟任...
    可笑_673c阅读 29评论 0 0
  • 1.函数的返回值 返回值就是函数执行以后返回的结果 通过return来指定函数的返回值 return后面可以跟任意...
    殿臣_e2c6阅读 265评论 0 0