首页 > 其他分享 >12函数进阶

12函数进阶

时间:2023-04-13 15:23:04浏览次数:43  
标签:12 进阶 作用域 func print lambda def 函数

函数进阶

函数的作用域

作用域又可以被称为命名空间,指变量起作用的范围。Python变量作用域可以分为四种,分别为局部作用域、嵌套作用域、全局作用域、内置作用域。

作用域 英文
局部作用域 Local
嵌套作用域 Enclosing
全局作用域 Global
内置作用域 Buiit-in

内建作用域是特质python api内置的一些操作,例如 len 、max等函数,无需声明就可使用。

变量作用域

一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:

  • 全局变量:定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
  • 局部变量:局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。
x = 2

def func():
    x = 3  # 局部变量    
    return x

result = func()
print(result)  # 3
print(x)  # 2

当我们在代码里使用变量时,Python创建对象,改变对象或查找对象都是在一个所谓命名空间下进行的(一个保存变量名的地方)。而函数除了打包代码之外,还定义了一个新的变量空间,一个函数所有的变量,都与函数的命名空间相关联:

  • def 内定义的变量名能够被 def内的代码使用,不能在函数外部引用这样的变量名
  • def之中的变量名与def之外的变量名并不冲突

也就是说:

  • 如果一个变量在def内被赋值,它就被定义在这个函数之内
  • 如果在def之外赋值,它就是整个文件全局的

回到上面的那个例子:

x = 2
def func(x):
    x = 3 
"""
尽管这两个变量名都是x,但是他们作用域(命名空间)可以把他们区别开。
作用域(命名空间)有助于防止程序之间变量名的冲突,而且,有助于函数成为更加独立的单元。
在Python中,函数定义了一个函数本地内的作用域,
而像x = 2这样赋值语句定义了一个全局作用域(模块级别的变量,使用范围仅限于单个文件)。
而像x = 3这样赋值语句定义了一个局部作用域(范围仅限于函数内部)。
"""

global关键字

函数中修改不了全局作用域的变量如需修改,加global关键字,声明变量为全局变量

y = 10
def func():
    global y
    y = 5
    print('y1 =', y)

func()	# y1 = 5
print('y2 =', y)  # y2 = 5
"""
函数体中使用了global关键字,声明y为全局变量,故在函数中就改变了y的值
若函数体中没有global y 语句,最后的结果就是y1 = 5,y2 = 10 4;这就跟上面的那个案例相同了
"""

nonlocal关键字

# E(enclosing):嵌套的父级函数的局部作用域
def mytest1():
    b = 6   # 局部变量    相对而言 我们的b是函数mytest2的全局变量
    def mytest2():
        #
        nonlocal b  # nonlocal 关键字用于在嵌套函数内部使用变量 了解即可 用的时候比较少
        b = 7  # 重新开辟了内存空间  注释掉直接打印b
        print(b, id(b))

    mytest2()
    print(b, id(b))

mytest1()
"""
7 1440395648
7 1440395648 
"""

函数作用域的优先级

高阶函数

概念与调用

高阶函数:一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数。

  • 一个函数的函数名作为参数传给另外一个函数
# 频繁的使用 需要其他的功能结合使用
def func():
    print("定义一个普通函数")

def high_level(func):
    print("定义一个高阶函数")  # 此函数的功能
    # 在函数内部,通过传入的函数参数调用
    func()  # 调用我传入的函数名的函数

high_level(func)
"""
定义一个高阶函数
定义一个普通函数
"""
  • 一个函数返回值(return)为另外一个函数(返回为自己,则为递归)
def func():
    print("定义一个普通函数")

def high_level(func):
    print("定义一个高阶函数")
    return func  # high_level
    #  return func() 这个是直接返回函数调用,递归函数就是如此

res = high_level(func)
# 高阶函数返回函数之后在调用func函数
res()
"""
定义一个高阶函数
定义一个普通函数
"""

递归

  • 函数内部自己调用自己
  • 必须要有出口
# 打印1-9(range)
def func(start, end, step=1):
    print(start)
    if start >= end:
        return  # 结束函数运行,停止递归
    func(start + step, end, step)

func(1, 9)

3、内置高阶函数

1)lambda函数

  • 匿名函数
  • 优点:节省内存空间,优化代码
# lambda函数
# 当函数里面只有一行代码时,可以转换为匿名函数
# 实际中,只使用一次,不需要考虑函数的名字,只需要功能
# lambda 传入的参数:返回的数据
def add(a, b):
    return a + b

print(add(1, 2))

print((lambda a, b: a + b)(1, 2))
add1 = (lambda a, b: a + b)  # 定义名字,重复使用

print(add1(2, 2))
print(add1(2, 3))
  • lamada参数实例
import random

# 无参数
sdds = lambda: random.random()
sdds()

# 一个参数
fun1 = lambda x: x
print(fun1('hello python'))

# 默认参数 (缺省参数)
fun2 = lambda a, b, c=100: a + b + c
print(fun2(10,19,1000))

# 可变参数之args
fun3 = lambda *args: args
print(fun3((1,2,3,4,5)))

# 可变参数之kwargs
fun4 = lambda  **kwargs: kwargs
print(fun4(name='yueyue',age=18,height='178cm'))

# 带判断的lambda表达式
asd = lambda x: x if (x > 10) else 10
print(asd(5))
#### 它是以下带有def和return 关键字的普通函数的更简单版本:
def fun(x):
    if x > 10:
        return x
    else:
        return 10
print(fun(5))
  • 列表中字典数据排序
# 列表中的字典排序
# 需求:假设我们需要对字典中的年龄进行排序
user_list = [
    {"name": 'zhangsan1', 'age': 18},
    {"name": 'lisi1', "age": 19},
    {"name": 'wangwu1', "age": 17}
]

def getAge(element):
    return element['age']

# 传递给key参数的是一个函数,它指定可迭代对象中的每一个元素来按照该函数进行排序
user_list.sort(key=getAge,reverse=True)
print(user_list)


# 我们需要使用匿名函数,使用sort函数中的key这个参数,来指定字典比大小的方法
# reverse参数控制升序与降序排列
user_list.sort(key=lambda x:x['age'],reverse=True)
print(user_list)

2)map函数

  • 语法:map(function, iterable, ...)
  • 参数:function —— 函数;iterable —— 可迭代对象
  • 作用:通过将指定的function函数依次作用在给定序列iterable中的每一个元素上,得到一个新的list并返回。注意,map不改变原list,而是返回一个新list。
# map函数 映射
# 列表数据转为字符串
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(map(lambda i: str(i), list1)))   # ['1', '2', '3', '4', '5', '6', '7', '8', '9']

print(list(map(str, list1)))    # ['1', '2', '3', '4', '5', '6', '7', '8', '9']

3)reduce函数

  • reduce() 函数来自 functools 模块。使用 reduce() 函数,需要在代码开始时使用以下语句导入 functools 模块:
from functools import reduce

关于模块(module)的知识和使用方法后续会进行深入学习。

  • 作用:先从列表(或序列)中取出2个元素执行指定函数,并将输出结果与第3个元素传入函数,输出结果再与第4个元素传入函数,…,以此类推,直到列表每个元素都取完。
from functools import reduce  # 导入内置reduce函数

def fn(x, y):
    return x + y

res = reduce(fn, [1, 3, 5, 7, 9])
print(res)	# 25

4)filter函数

  • 语法:reduce(function, iterable)
  • 参数:function —— 函数;iterable —— 可迭代对象
  • 作用:filter函数也是接收一个函数和一个序列的高阶函数,其主要功能是过滤。
# 在一个list中,删掉偶数,只保留奇数
def is_odd(n):
    return n % 2 == 1

print(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))  # <filter object at 0x00000193E06AE860>
print(list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])))  # [1, 5, 9, 15]

学员管理系统

这个建议自行去写一下,除了这个系统,还有图书馆管理系统,宿舍管理系统等,网络上都有许多教程,换汤不换药的,有需要可以联系。

标签:12,进阶,作用域,func,print,lambda,def,函数
From: https://www.cnblogs.com/daguo118/p/17314962.html

相关文章

  • Ubuntu 18.04 LTS 环境下 接收函数 hk 1.3 安装及配置
    hk下载1$wgethttp://www.eas.slu.edu/People/LZhu/downloads/hk1.3.tar#下载2$tar-xvfhk1.3.tar#解压3$mvhk/home/wangjq/opt/hk3$cdhk4$makeclean5$rm.gmtcommands4#删除临时文件修改Makefile1$viMakefile#添加如下语句 GMT_INC=-I......
  • django 1.8 官方文档翻译: 3-1-3 Django 的快捷函数
    Django的快捷函数django.shortcuts收集了“跨越”多层MVC的辅助函数和类。换句话讲,这些函数/类为了方便,引入了可控的耦合。renderrender(request,template_name[,context][,context_instance][,content_type][,status][,current_app][,dirs][,using])[source]结合一个......
  • django 1.8 官方文档翻译: 2-5-10 数据库函数
    数据库函数NewinDjango1.8.下面记述的类为用户提供了一些方法,来在Django中使用底层数据库提供的函数用于注解、聚合或者过滤器等操作。函数也是表达式,所以可以像聚合函数一样混合使用它们。我们会在每个函数的实例中使用下面的模型:classAuthor(models.Model):name=model......
  • Exp 5 信息搜集与漏洞扫描—20201229赵斌
    Exp5信息搜集与漏洞扫描一、实践目标掌握信息搜集的最基础技能与常用工具的使用方法各种搜索技巧的应用DNSIP注册信息的查询基本的扫描技术:主机发现、端口扫描、OS及服务版本探测、具体服务的查点(以自己主机为目标)漏洞扫描:会扫,会看报告,会查漏洞说明,会修补漏洞(以自己主......
  • [ARC127E] Priority Queue 题解
    首先我们每次加入的数必定是一个\(1\sima\)的排列,但从排列角度考虑的话非常复杂,因为\(s\)是一个集合。所以我们考虑最后能剩下哪些数。考虑最后剩下的集合为\(\{a_i\}\),其中\(a_i<a_{i+1}\),显然这个集合里面的元素个数为\(A-B\)。那么我们会发现一件事情:我们按上升序依......
  • 11函数入门
    函数入门函数的作用函数就是将一段具有独立功能的代码块整合到一个整体并命名在需要的位置调用这个名称即可完成对应的需求。作用:封装代码,实现代码重用,减少内存空间,方便代码的管理和维护函数的使用定义函数def函数名称(参数):代码1代码2......retu......
  • c语言贪吃蛇(2)关于蛇的函数封装
    hassnakenode():检测循环体内部是否含有蛇身结点,若有,则返回1(对应main输出蛇结点),否则判断点后移吗,再判断,之后返回0(不输出蛇结点)  addnode():创造新蛇结点,用malloc申请空间,并插入到尾结点之后。(尾插法)initsnake():创建初始头尾结点,malloc申请空间,方便后续蛇结点的添加,初始赋......
  • 学习笔记399—彻底明白ip地址,区分localhost、127.0.0.1和0.0.0.0
    彻底明白ip地址,区分localhost、127.0.0.1和0.0.0.0通俗的了解IP地址是什么对于IP地址,大家并不陌生,特别是在网络访问中我们会经常使用到(平时对域名如百度的www.baidu.com的访问,本质就是对域名所绑定的IP地址的访问),那么IP地址是什么呢?首先,我们要知道网络中的相互访问其实就是在......
  • 力扣1127(MySQL)-用户购买平台(困难)
    题目:支出表:Spending这张表记录了用户在一个在线购物网站的支出历史,该在线购物平台同时拥有桌面端(‘desktop’)和手机端(‘mobile’)的应用程序。这张表的主键是(user_id,spend_date,platform)。平台列platform是一种ENUM,类型为(‘desktop’,‘mobile’)。问题写一段SQL......
  • 2023年4月的12篇AI论文推荐
    GPT-4发布仅仅三周后,就已经随处可见了。本月的论文推荐除了GPT-4以外还包括、语言模型的应用、扩散模型、计算机视觉、视频生成、推荐系统和神经辐射场。1、GPT-4TechnicalReporthttps://arxiv.org/abs/2303.08774SébastienBubeck,VarunChandrasekaran,RonenEldan,Joh......