阿里云服务器部署网站/廊坊网络推广公司

阿里云服务器部署网站,廊坊网络推广公司,成都到西安高铁票价,dedecms手机网站模板你好,我是安然无虞。 文章目录 再学函数1. 变量在函数中的作用域2. 函数的参数传递.补充学习: 不定长参数*args和**kwargs 3. 值传递和引用传递补充学习: 把函数作为参数传递 4. 匿名函数5. python中内置的常用函数zip()map()filter()all()any() 6. 函数练习 再学函…

在这里插入图片描述

你好,我是安然无虞。

文章目录

    • 再学函数
      • 1. 变量在函数中的作用域
      • 2. 函数的参数传递.
        • 补充学习: 不定长参数*args和**kwargs
      • 3. 值传递和引用传递
        • 补充学习: 把函数作为参数传递
      • 4. 匿名函数
      • 5. python中内置的常用函数
        • zip()
        • map()
        • filter()
        • all()
        • any()
      • 6. 函数练习

在这里插入图片描述

再学函数

1. 变量在函数中的作用域

变量的作用域是指变量的作用范围.

局部变量: 在函数体或局部范围内声明的变量称为局部变量.局部变量仅在局部作用域内有效.

全局变量: 在函数之外或在全局范围内声明的变量称为全局变量.全局变量允许在函数内部和外部访问,但是不允许在函数内部修改.

golbal: 用于在函数内部访问和修改全局作用域中的变量.通过在函数内部使用 global 关键字声明变量,该变量就可以在函数内部被修改,并且修改后的值也会影响到全局作用域中的变量.

x = 10def modify_global_variable():global xx = 20print(x)
modify_global_variable()
print(x)

nonlocal: 用于在嵌套函数中修改嵌套作用域外的变量。它允许你在内部函数中访问并修改外部函数的局部变量,而不是创建一个新的同名局部变量.并且会影响到外部函数中的同名变量.这样可以实现在嵌套函数中共享和修改变量的目的.(如果不加nonlocal, 也是可以在嵌套函数中访问到外层的变量的,只是无法修改)

 def outer():x = "local"def inner():nonlocal xx = "nonlocal"print(x)inner()print("outer:", x)x = 'global'outer()print('global:', x)

2. 函数的参数传递.

函数参数的传递可以分为4类:

  1. 位置参数: 调用函数时根据函数定义的参数的位置来传递参数.

  2. 关键字参数: 函数调用通过key=value的形式来传递参数, 可以让函数更加的清晰, 同时也不需要强调顺序.

def self_introduction(name, age, gender):print(f"你好, 我的名字叫{name}")print(f"今年{age}岁, 性别{gender}")self_introduction(name="zhangsan", age=25, gender='男')

需要注意的是: 位置参数和关键字参数可以混用, 但是位置参数必须在前面, 且需要匹配顺序.
但是关键字参数之间, 不存在先后顺序.

# 强制关键字参数.
def self_introduction(name, age, *, gender):print(f"你好, 我的名字叫{name}")print(f"今年{age}岁, 性别{gender}")self_introduction("lisi", '男', gender=25)
  1. 缺省参数: 也叫做默认参数, 用于在定义函数的时候为参数提供默认值, 调用函数时可以不传递该参数的值, 所有的位置参数必须出现在默认参数前, 包括函数定义和调用.
def self_introduction(name, age, come_from='中国'):print(f"你好, 我的名字叫{name}, 今年{age}岁, 我来自{come_from}")self_introduction(name="zhangsan", age=25)
  1. 不定长参数: 也叫做可变参数, 用于不确定调用的时候会传递多少参数.

    a. 位置传递: *args. 传递给函数的所有参数, 都会被args所接受,会根据传进去的参数的位置组成一个元组.

    • *args允许函数接受任意数量的位置参数.
    • 它以元组的形式传递参数,函数内部可以使用args变量来获取到参数.

    b. 关键字传递: **kwargs, 在参数是key=value的情况下, 所有的key-value都会被kwargs接收, 同时会将key-value组成一个字典.

    • **kwargs允许函数接收任意数量的关键字参数.
    • 它以字典的形式传递参数, 函数内部可以使用kwargs变量来引用这个字典.
def average(a, b, c):print((a + b + c) / 3)

1.通过位置传递不定常参数

# 通过位置传递不定长参数def average(*args):# print(type(args)) -> 元组# print(args) -> (1,2,3,4,5,6)print(sum(args) / len(args))average(1, 2, 3, 4, 5 ,6)

2.通过关键字传递不定长参数

def self_introduction(**kwargs):print(kwargs)# print(f"你好, 我的名字叫{name}, 今年{age}岁, 我来自{come_from}")self_introduction(name="zhangsan", age=25, come_from='北京')

3.不定长参数在Python当中的应用

def self_introduction(*args, **kw):# print(args)# print(kw)# print(type(kwargs))# print(kwargs)print(f"你好, 我的名字叫{args[0]}, 今年{kw['age']}岁, 我来自{kw['come_from']}")self_introduction("zhangsan", age=25, come_from='北京')
补充学习: 不定长参数*args和**kwargs

请看这块代码:

def wrapper(*args, **kwargs):# 这里直接使用args和kwargs,并没有加上*号cache_key = (args, tuple(sorted(kwargs.items())))if cache_key in cache:return cache.get(cache_key)# 这里使用的是加上*号的*args和**argsresult = func(*args, **kwargs)cache[cache_key] = resultreturn result

注意我在上面代码中注释部分的内容, 现在请思考不加 * 号的不定长参数和加上 * 号的不定长参数在用法上有什么区别?

首先再次说明一下Python当中的*args和**kwargs的用法:

  1. *args

    • 作用:*args 用于将多个位置参数(非关键字参数)收集为一个元组
    • 语法:在函数定义中,*args 放在形参列表的最后,表示接收所有未被其他形参捕获的位置参数
  2. **kwargs

    • 作用:**kwargs 用于将多个关键字参数收集为一个字典
    • 语法:在函数定义中,**kwargs 放在形参列表的最后,表示接收所有未被其他形参捕获的关键字参数
  3. 结合使用 *args 和 **kwargs
    在函数定义中,*args 和 **kwargs 可以同时使用,但 *args 必须在 **kwargs 之前

在上面的代码中:

def wrapper(*args, **kwargs):# 这里直接使用args和kwargs,并没有加上*号cache_key = (args, tuple(sorted(kwargs.items())))if cache_key in cache:return cache.get(cache_key)# 这里使用的是加上*号的*args和**argsresult = func(*args, **kwargs)cache[cache_key] = resultreturn result

函数定义当中的形参: def wrapper(*args, **kwargs):

  • *args 和 **kwargs 的接收:
    • *args 接收所有位置参数, 存储为元组
    • **kwargs 接收所有关键字参数, 存储为字典

下面在函数体中使用不定长参数:

# 这里直接使用args和kwargs,并没有加上*号
cache_key = (args, tuple(sorted(kwargs.items())))
print(type(args)) # tuple
print(type(kwargs)) # dict

args 和 kwargs 是作为普通变量使用的,而不是作为参数传递给函数. 这里的 args 是一个元组,kwargs 是一个字典,它们已经被函数定义中的 *args 和 **kwargs 收集并存储了

如果直接打印这里的args和kwargs的类型会发现分别是tuple()和dict()

但是我们发现在函数调用中使用的是加上*号的不定长参数:

# 这里使用的是加上*号的*args和**args
result = func(*args, **kwargs)

其实, 在函数调用中,*args 和 **kwargs 用于将已有的数据结构(元组或字典)**解包** 为函数的参数

  • *args:将一个元组解包为多个位置参数
  • **kwargs:将一个字典解包为多个关键字参数

总结:

  • 函数定义中,*args 和 **kwargs 用于收集动态参数
  • 函数调用中,*args 和 **kwargs 用于解包已有的数据结构(元组或字典)为函数的参数

3. 值传递和引用传递

值传递(Pass by Value)和引用传递(Pass by Reference)是关于函数参数传递方式的两个概念.

值传递是指将实际参数的值复制一份给形式参数,函数中对形式参数的修改不会影响到实际参数的值。在值传递中,函数中对形式参数的修改只会影响到函数内部,不会影响到函数外部。

# 值传递
def modify_value(x):x = 10print(x)value = 5
modify_value(value)
print(value)

引用传递是指将实际参数的引用(地址)传递给形式参数,形式参数和实际参数指向同一块内存地址,函数中对形式参数的修改会影响到实际参数的值。在引用传递中,函数中对形式参数的修改会反映到函数外部.

# 引用传递
def modify_list(lst):lst.append(4)  # 修改参数(列表)的内容print(1, id(lst))# lst += [5] # 不会创建新对象, 所以id值不变, 注意这里不要误解+=lst = lst + [5] # 创建了新对象print(2, id(lst))print(1, lst)my_list = [1, 2, 3]
print(3, id(my_list))
modify_list(my_list)
print(2, my_list)

补充说明:

  • 不可变对象(如字符串、元组、数字等):修改内容时会创建新的对象,id 值会改变
  • 可变对象(如列表、字典、集合等):修改内容时不会创建新的对象,id 值保持不变

需要注意的是,虽然在Python中没有严格的引用传递机制,但是对于可变对象(如列表、字典等),它们的传递方式是引用传递,因为它们的值可以在函数内部被修改. 而对于不可变对象(如数字、字符串等),它们的传递方式类是值传递,因为函数内部对形式参数的修改不会影响到实际参数

理解值传递和引用传递的概念对于编写和调试代码非常重要,可以帮助我们更好地理解函数参数传递的机制和代码中的行为.

# 注意比较下面两种调用方式:
def f(x, li=[]):for i in range(x):li.append(i)print(li)# 1. 方式一
print('当参数为4')
f(4)
print('当参数为5')
# 注意哦, 这里使用的依然是之前的那个默认的li的地址
f(5)# 2. 方式二
print('当参数为4')
f(4)
print('当参数为5')
f(5, li=[4, 5]) # 这里使用的是指定的列表, 所以地址变了
补充学习: 把函数作为参数传递
# 当把函数作为参数传递.
a_list = [15, 111, 2232, 123123, 324234]# 将a_List排序, 排序的根据是数字的个位.
def sorted_by(num):num_string = str(num)[-1]return int(num_string)b_list = sorted(a_list, key=sorted_by)
print(b_list)# 改写之前的计算器:def add(a, b):return a + bdef calc(a, b, func):return func(a, b)res = calc(6, 6, add)
print(res)

4. 匿名函数

也称为lambda函数,是一种简洁的函数定义方式,用于创建一次性的、简单的函数.

匿名函数的语法形式为:lambda 参数: 表达式

匿名函数的返回值就是 表达式的结果

它由关键字 lambda 开头,后跟一个或多个参数,然后是冒号 :,最后是一个表达式, 匿名函数执行表达式的计算,并返回结果.

匿名函数通常用于需要简单函数逻辑的地方,尤其是在需要传递函数作为参数的情况下,可以更简洁地定义函数,避免定义命名函数的繁琐。但需要注意的是,匿名函数通常用于表达式较短、逻辑简单的情况,对于复杂的函数逻辑,仍然建议使用命名函数进行定义

def add(a, b):return a + b
lambda a, b: a + b

案例: numbers = [5, 2, 7, 1, 9] 对此列表排序, 根据对3取余的 结果进行排序.

# numbers = [5, 2, 7, 1, 9] 对此列表排序, 根据对3取余的 结果进行排序.
#            2  2  1  1  0
numbers = [5, 2, 7, 1, 9]a_list = sorted(numbers, key=lambda x: x % 3)
print(a_list)

改写前面的计算器程序:

def calculator(a, b, operator):operator_dict = {'+': lambda x, y: x + y,'-': lambda x, y: x - y,'*': lambda x, y: x * y,'/': lambda x, y: x / y,}return operator_dict.get(operator)(a, b)res = calculator(6, 6, '*')
print(res)

5. python中内置的常用函数

zip()

zip: zip([iterable, …]), 将多个可迭代对象打包成元组.它返回一个可迭代的对象,该对象生成元组,每个元组包含来自每个可迭代对象的元素, 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同.以长的为主使用zip_longest方法

# zip
from itertools import zip_longest
numbers = [1, 2, 3, 4]
letters = ['a', 'b', 'c']
x_list = ['d', 'e']zipped = list(zip_longest(numbers, letters, x_list, fillvalue=0))
print(zipped)for item in zipped:print(item)
map()

map(): map(function, iterable):对可迭代对象中的每个元素应用指定的函数.

# map
def square(x):return x ** 2numbers = [1, 2, 3, 4, 5]# 要将numbers中的数字全部转换为字符串.
a_list = list(map(str, numbers))
print(a_list)
squared_numbers = map(lambda x: x**2, numbers)
print(squared_numbers)
print(list(squared_numbers))
filter()

filter(): filter(function, iterable): 对可迭代对象中的元素进行过滤. 返回值为True时保存

# filter
def is_even(x):return x % 2 == 0numbers = [1, 2, 3, 4, 5]even_numbers = filter(lambda x: x % 2 != 0, numbers)print(list(even_numbers)) # [1, 3, 5]
all()

all(): all(iterable):判断可迭代对象中的所有元素是否都为真.如果是返回 True,否则返回 False.

# all 判断可迭代对象中的所有元素是否都为真.如果是返回 True,否则返回 False.
print(all(['a', 'b', 'c', ''])) # False
print(all([])) # True 注意哦,Python规定如果可迭代对象为空, all()的结果就是 Truenumbers = [1, 2, 3, 4, 5, -1]
# 使用 all() 函数判断是否所有元素都大于0
sign = all(num > 0 for num in numbers)
print(sign) # False
any()

any(): any(iterable): 判断可迭代对象中的任何一个元素是否为真(有一个为真就是真).不是则返回 False,如果有一个为 True,则返回 True.

# any
# print(any(['', 0, '', None]))
# print(any([]))
numbers = [1, 3, 5, -1]
# 使用 any() 函数判断numbers中是否存在偶数元素
sign = any(num % 2 == 0 for num in numbers)
print(sign)

6. 函数练习

1.编写一个函数 get_sum_of_lists,接受多个列表作为参数,并返回它们对应位置元素的和的列表 短列表缺少的用0补齐.

from itertools import zip_longest
# [1, 2, 3, 4, 5, 6]
# [6, 5, 4, 3, 2, 1]
# 拆包
def get_sum_of_lists(*args):# print(*args)zipped = list(zip_longest(*args, fillvalue=0))result = list(map(sum, zipped))return resultlst1 = [1, 2, 3, 4, 5, 6, 7, 8]
lst2 = [6, 5, 4, 3, 2, 1]
lst3 = [6, 5, 4, 3, 2, 1, 3, 6]res = get_sum_of_lists(lst1, lst2, lst3)
print(res)

2.实现一个函数 get_max_length(words),接收一个字符串列表 words,返回列表中最长的单词的长度.

例如,对于输入列表 [‘apple’, ‘banana’, ‘orange’, ‘watermelon’],函数应该返回 10,因为最长的单词是 ‘watermelon’,它的长度为 10

def get_max_length(words):# len_list = list(map(len, words))len_list = [len(word) for word in words]return max(len_list)lst = ['apple', 'banana', 'orange', 'watermelon']
print(get_max_length(lst))

3.实现一个函数get_primes, 接收一个参数n, 函数功能是: 返回n以内(包含n)的所有的质数. get_primes函数体内使用lambda实现.

只能被1跟它本身整除的数. 2, 3, 4, 5 ,6 ,7 ,8 ,9, 10 每一次取余的结果都不是0, 那么它就是质数. 反之, 就不是质数.

# all, all true , false
# filter
# 5 2 3 4
# 6 2 3 4 5
def get_primes(n):primes_list = list(filter(lambda x: all(x % i != 0 for i in range(2, x)), range(2, n + 1)))return primes_listprimes = get_primes(20)
print(primes)
遇见安然遇见你,不负代码不负卿。
谢谢老铁的时间,咱们下篇再见~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyUI数据表格中嵌入下拉框

效果 代码 $(function () {// 标记当前正在编辑的行var editorIndex -1;var data [{code: 1,name: 1,price: 1,status: 0},{code: 2,name: 2,price: 2,status: 1}]$(#dg).datagrid({data: data,onDblClickCell:function (index, field, value) {var dg $(this);if(field ! …

【C语言】多进程/多线程

【C语言】多进程/多线程 参考链接多进程/多线程服务器1. 多进程服务器2. 多线程服务器 结语参考链接 参考链接 c 中文网 菜鸟 c 多进程/多线程服务器 多进程和多线程是常用的并发编程技术。它们都允许程序同时执行多个任务,提高了系统的资源利用率和程序的运行效率…

mysql 磐维(opengauss)tidb误删数据之高级恢复

Mysql参考: Mysql 8.0 XtraBackupMysqlbinlog 完全恢复 - 墨天轮 Mysql 8.0 XtraBackupMysqlbinlog 完全恢复[TOC]# 一、安装mysql 8.0.19## 1.1https://www.modb.pro/db/509223MySQL 的全量备份、增量备份与 Binlog 时间点恢复_mysqlbinlog自动备份吗-CSDN博客文章…

3. 轴指令(omron 机器自动化控制器)——>MC_SetPosition

机器自动化控制器——第三章 轴指令 11 MC_SetPosition变量▶输入变量▶输出变量▶输入输出变量 功能说明▶时序图▶重启动运动指令▶多重启运动指令▶异常 MC_SetPosition 将轴的指令当前位置和反馈当前位置变更为任意值。 指令名称FB/FUN图形表现ST表现MC_SetPosition当前位…

MySQL面试专题

1.什么是BufferPool? Buffer Pool基本概念 Buffer Pool:缓冲池,简称BP。其作用是用来缓存表数据与索引数据,减少磁盘IO操作,提升效率。 Buffer Pool由缓存数据页(Page) 和 对缓存数据页进行描述的控制块 组成, 控制…

调用百度api实现语音识别(python)

该代码实现了一个企业级的语音识别解决方案,通过调用百度语音识别API,实现实时录音识别和对已有音频语音识别功能。 百度智能云:请自行访问百度智能云,开通免费的语音识别功能,获取API_KEY和SECRET_KEY。操作按照百度流程即可,可免费申请。 首先,配置下百度API和描述下错…

KRaft模式

目录标题 Kraft模式**1. 什么是Kraft模式?****2. 为什么引入Kraft模式?****3. 核心优势****4. 架构与工作原理****5. 部署与配置要点****6. 适用场景与最佳实践****总结**KIP-833: Mark KRaft as Production Ready除了Kraft模式,Kafka还有以下…

常见框架漏洞之一:Thinkphp5x

ThinkPHP是为了简化企业级应⽤开发和敏捷WEB应⽤开发⽽诞⽣的,是⼀个快速、兼容⽽且简单的轻量级国产PHP开发框架,诞⽣于2006年初,原名FCS,2007年元旦正式更名为 ThinkPHP,遵循Apache2开源协议发布,从Stru…

2025年优化算法:龙卷风优化算法(Tornado optimizer with Coriolis force,TOC)

龙卷风优化算法(Tornado optimizer with Coriolis force)是发表在中科院二区期刊“ARTIFICIAL INTELLIGENCE REVIEW”(IF:11.7)的2025年智能优化算法 01.引言 当自然界的狂暴之力,化身数字世界的智慧引擎&…

Mysql表的简单操作

🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 3.1 创建表 3.2 查看表结构 3.3 修改表 1. 添加字段 2. 修改字段 3…

【云馨AI-大模型】自动化部署Dify 1.1.2,无需科学上网,Linux环境轻松实现,附Docker离线安装等

Dify介绍 官网:https://dify.ai/zh生成式 AI 应用创新引擎开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力,轻松构建和运营生成式 AI 原生应用。 Dify安装脚本 目录创建 mkdir -p /data/yunxinai &&a…

人脸表情识别系统分享(基于深度学习+OpenCV+PyQt5)

最近终于把毕业大论文忙完了,众所周知硕士大论文需要有三个工作点,表情识别领域的第三个工作点一般是做一个表情识别系统出来,如下图所示。 这里分享一下这个表情识别系统: 采用 深度学习OpenCVPyQt5 构建,主要功能包…

GitHub供应链攻击事件:Coinbase遭袭,218个仓库暴露,CI/CD密钥泄露

此次供应链攻击涉及GitHub Action "tj-actions/changed-files",最初是针对Coinbase的一个开源项目的高度定向攻击,随后演变为范围更广的威胁。 攻击过程与影响 Palo Alto Networks Unit 42在一份报告中指出:“攻击载荷主要针对其…

GZCTF平台搭建及题目上传

前言 我用手里的Ubuntu虚拟机搭建的,大家根据自己的实际情况来吧 安装及部署 首先,你的虚拟机需要有Docker和Docker-Compose,前者可以看我之前的文章,另外一个可以输入下面的命令安装,注意先获取管理员权限&#xff…

Pycharm社区版创建Flask项目详解

一、创建工程项目 二、配置工程目录 新建的空项目下创建目录。 1、新建app.py文件 2、app.py代码如下: from flask import Flask, render_templateapp Flask(__name__)app.route("/") def root():"""主页:return: Index.html"&qu…

运动仿真——phased.Platform

在雷达仿真过程中,运动仿真的必要性,以及运动仿真可以实现哪些功能,在matlab对应的user guide中已经讲的很清楚了,这里不再赘述。 本文主要介绍phased.Platform的一些“坑”,和典型的用法。 第一坑:系统对…

缓存删除三级补偿方案:延迟队列+消息队列+定时任务兜底

问题背景: 在 Cache-Aside 模式中,更新数据库后删除缓存失败会导致数据不一致。本文提供工业级三级补偿方案,实现最终一致性保障。 整体架构: 更新操作触发 → 一级延迟队列 → 二级消息队列 → 三级定时任务方案实现: 一、第一级补偿:延迟队…

C++题目

1、内存管理 1.内存模型 栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。 堆:就是那些由new分配的内存块,其释放由程序员控制(一个new对应一个delete&#xff09…

天地图InfoWindow插入React自定义组件

截至2025年03月21日天地图的Marker不支持添加Label; 同时Label和Icon是不支持自定义HTMLElement只支持String;目前只有InfoWindow支持自定义HTMLElement; 效果图 React核心api import ReactDOM from react-dom/client const content document.createElement(div);…

【STM32】第一个工程的创建

目录 1、获取 KEIL5 安装包2、开始安装 KEIL52.1、 激活2.2、安装DFP库 3、工程创建4、搭建框架5、开始编写代码 1、获取 KEIL5 安装包 要想获得 KEIL5 的安装包,在百度里面搜索“KEIL5 下载”即可找到很多网友提供的下载文件,或者到 KEIL 的官网下载&a…