Data Types and operation

本文围绕Python展开,介绍了其赋值方式、自操作运算符、格式化输出和类型检查等。详细阐述了布尔运算、字符串、列表、元组、集合和字典等数据类型的特点、操作及运算,还对比了字符串和列表在更改与赋值上的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Data Types and operation

  • Python 赋值方式
x = 2
y = 3
z = 5

x,y,z = 2,3,5
  • python 支持自操作运算符
#variables.py

reservoir_volume = 4.445e8
rainfall = 5e6
rainfall -= rainfall*0.1
reservoir_volume += rainfall
reservoir_volume += reservoir_volume*0.05
reservoir_volume -= reservoir_volume*0.05
reservoir_volume -= 2.5e5

print(reservoir_volume)
  • python 可格式化输出
print('The num is %.2f',%(1.11+2.22))

>>> format(math.pi, '.12g')  # give 12 significant digits
'3.14159265359'

>>> format(math.pi, '.2f')   # give 2 digits after the point
'3.14'

>>> repr(math.pi)
'3.141592653589793'
  • python 类型检查
#每一个对象都是一个类型
#对象类型定义了哪些运算符和函数适合该对象以及计算原理
#type()得到一个对象的类型
print(type(crs_per_rab))
  • 数据类型转换
#初始浮点数赋值
f_ex1 = 383.
f_ex2 = 383.0

#数据类型转换
x = int(4.7)   # x is now an integer 4
y = float(4)   # y is now a float of 4.0

Tip

print(0.1+0.1+0.1)
>> 0.30000000000000004

出现上面情况的原因是我们使用的数制均为10进制,但是计算机表示类型是2进制,就比如1/3用10进制只能近似的表示一样,大部分数10进制小数也只能由2进制近似表示,比如0.1

存在多个数转换为二进制存储在机器中时,近似于一个值.

0.1 and 0.10000000000000001 and 0.1000000000000000055511151231257827021181583404541015625 are all approximated by 3602879701896397 / 2 ** 55.

所以有

>>> .1 + .1 + .1 == .3
False
>>> round(.1, 1) + round(.1, 1) + round(.1, 1) == round(.3, 1)
False

>>> round(.1 + .1 + .1, 10) == round(.3, 10)
True

Boolean 布尔运算

True or False

  • 运算
    • and 与
    • or 或
    • not 非

String

#''内可以无须用转义字符就正常显示字符串内的双引号
#如果''和''''都有,利用/转义
#
    • 连接字符串
    • 重复字符串
  • lower()
first_world = 'hello'
second_word = 'world'
print(first_world + ' ' + second_word)

word = '9'
word *= 5

len(word)

sample_string.lower()
# Example 1
>>> print("Mohammed has {} balloons".format(27))

Mohammed has 27 balloons

# Example 2
>>> # Example 2
>>> animal = "dog"
>>> action = "bite"
>>> print("Does your {} {}?".format(animal, action))

Does your dog bite?

# Example 3
maria_string = "Maria loves {} and {}"
print(maria_string.format("math","statistics"))

Maria loves math and statistics

  • split()
    • 返回一个list,其中包含字符串中所有被分割后的单词
    • separator:给定该参数,按给出字符进行分割
    • maxsplit: 给定该参数,返回一个list,长度为maxsplit+1,最后一个是剩余字符串
new_str = "The cow jumped over the moon."
new_str.split()

new_str.split(' ', 3)

new_str.split('.')

new_str.split(None, 3)

[‘The’, ‘cow’, ‘jumped’, ‘over the moon.’]

[‘The’, ‘cow’, ‘jumped’, ‘over the moon.’]

[‘The cow jumped over the moon’, ‘’]

[‘The’, ‘cow’, ‘jumped’, ‘over the moon.’]


List

  • List
    • list是有序的
    • 与其他高级语言不同,python支持在一个list中包含许多数据类型
    • 用[中括号]声明和创建
list_of_random_things = [1, 3.4, 'a string', True]
  • 与其他高级语言不同,list支持通过负数index进行随机访问,其为倒数位置
>>> list_of_random_things[-1] 
True
>>> list_of_random_things[-2] 
a string
  • 操作与运算
    • 切片
    • 左闭右开区间内的所有元素
>>> list_of_random_things = [1, 3.4, 'a string', True]
>>> list_of_random_things[1:2]
[3.4]

>>> list_of_random_things[:2]
[1, 3.4]

>>> list_of_random_things[1:]
[3.4, 'a string', True]
- in or not in
>>> 'this' in 'this is a string'
True
>>> 'in' in 'this is a string'
True
>>> 'isa' in 'this is a string'
False
>>> 5 not in [1, 2, 3, 4, 6]
True
>>> 5 in [1, 2, 3, 4, 6]
False
  • len()
    • 列表中的元素数量
  • max()
    • 列表中的最大元素
  • min()
    • 列表中的最小元素
  • sorted()
    • 返回一个排序后的list,且不更改原list
  • join()
    • 一个字符串操作
    • 接受一个字符串列表作为参数,并且返回一个由分隔符连接起来的字符串
>>> new_str = "\n".join(["fore", "aft", "starboard", "port"])
print(new_str)

fore
aft
starboard
port
  • append
    • 添加一个元素到list的尾部
> letters = ['a', 'b', 'c', 'd']
> letters.append('z')
> print(letters)

['a', 'b', 'c', 'd', 'z']
  • 可变性与不可变性
    • list是可变得
      • 可直接进行=,index改变
    • string是不可变的
      • 要想改变需要进行创建一个新的字符串来进行更改
>>> my_lst = [1, 2, 3, 4, 5]
>>> my_lst[0] = 'one'
>>> print(my_lst)
['one', 2, 3, 4, 5]

>>> greeting = "Hello there"
>>> greeting[0] = 'M'

上面可行,下面不可行

Summary

python新的多变量赋值形式

list与其他高级语言不同的地方

在通过索引进行更改的时候,要注意这个对象是可变的么?
通过索引访问的时候,要注意这个对象是有序的么?

  • Stirng 和 list 进行更改和赋值的区别
name = "jim"
student = name
name = "john"
# name = 'john' student = 'jim'
#其开辟了两个内存区域存放内容,且name和student各有所指

scores = ["B","A","C"]
grades = scores
scores[1] = "S"
#scores = ["B","S","C"]
#grades = ["B","S","C"]
#其在内存区域当中开辟一个空间来存放一个list,进行赋值操作时所有变量名都指向的是同一个list

Tuples

  • Tuple
    • 不可变的有序数据结构
    • 创建元组时,括号时可选的
    • 通常用于存储相关信息
    • 用(小括号)声明和创建
#元组解包
dimensions = 52,40,100
length,width,height = dimensions
print("The dimensions are {}*{}*{}".format(length,width,height))

Sets

  • set

    • 可修改
    • 无序
    • 元素唯一
    • 用{大括号}声明和创建
  • 操作与运算

    • in
      • 元素是否在set中
    • pop
      • 随机移除一个元素并返回该元素
    • 逻辑运算比其他容器的运算符快
> fruit = {"apple", "banana", "orange", "grapefruit"}  
# define a set

> print("watermelon" in fruit)  

# check for element
False


> fruit.add("watermelon")  
> print(fruit)
# add an element
{'grapefruit', 'orange', 'watermelon', 'banana', 'apple'}

> print(fruit.pop())
grapefruit
# remove a random element
{'orange', 'watermelon', 'banana', 'apple'}


Dictionnaries

  • dictionary
    • 可变数据类型
    • 存储的是键值对
    • 键可以是任何不可变的元素
    • 键唯一
    • 各键不一定相同
> elements = {"hydrogen": 1, "helium": 2, "carbon": 6}

> print(elements["helium"])  
# print the value mapped to "helium"
2

> elements["lithium"] = 3  
# insert "lithium" with a value of 3 into the dictionary

  • in
> print("carbon" in elements)
> print(elements.get("dilithium"))
True
None
  • is or is not
> n = elements.get("dilithium")
> print(n is None)
> print(n is not None)

True
False
  • Dictionnary的嵌套声明
> elements = {'hydrogen': {'number': 1, 'weight': 1.00794, 'symbol': 'H'},
            'helium': {'number': 2, 'weight': 4.002602, 'symbol': 'He'}}

# todo: Add an 'is_noble_gas' entry to the hydrogen and helium dictionaries
# hint: helium is a noble gas, hydrogen isn't

Summary

["key"]访问若不存在会抛出一个keyerror
get若不存在则返回none

存在的操作有
in,is,is not
新增:
dict["newkey"] = xxx

可变
键值对,键唯一
可通过键访问
键可以是任何不可变的元素
<think>我们有一个任务:从execution_res字典中筛选出特定条件下的'code'值,并将这些值存入一个字符串变量types中。注意,原代码中types是一个列表,但用户现在要求存入字符串变量。这里需要明确:用户是希望将多个符合条件的code值连接成一个字符串,还是只取第一个?根据问题描述,原代码是追加到列表,现在改为字符串,可能是希望将多个符合条件的code连接起来。不过,原问题描述是“将其条件满足的值存入types变量中”,并且原代码中types是一个列表(初始化为[item["code"]])。现在用户要求存入字符串变量,那么我们需要决定如何连接这些字符串(例如用逗号分隔,或者空格等)。由于用户没有指定连接方式,我们可以考虑两种方案:1.如果只有一个符合条件的值,直接存入字符串。2.如果有多个,则用逗号(或其他分隔符)连接。但原代码中,一旦找到符合条件的项,就会将当前项的code赋值给一个只有一个元素的列表。这实际上只取了第一个匹配项?因为原代码中使用了`types=[item["code"]]`,这会导致覆盖之前的结果,并且只保留最后一个匹配项?不对,原代码逻辑是:一旦找到第一个匹配项,就将其code放入列表(并覆盖之前的值)然后继续循环?实际上原代码有逻辑错误,因为它在循环内每次找到匹配项就重新赋值整个列表为当前项的code(即只保留最后一个匹配项)。但原代码中内层循环对每个item进行判断,如果匹配就赋值,这样会导致多次赋值,最终types只保留最后一个匹配的code。用户要求优化代码,并希望将满足条件的值存入字符串变量types。我们需要做的是:1.收集所有满足条件的item的code值(即可能有多个)。2.将这些code值连接成一个字符串(例如用逗号分隔)。因此,我们调整思路:收集所有匹配的code,然后将其连接成字符串。根据引用[1]中关于PEP8的提示(虽然未列出具体内容,但我们可以遵循PEP8规范编写清晰代码),以及引用[2]关于模块导入时执行代码的注意事项(此处不涉及模块导入,但要注意代码结构)。优化后的代码步骤:1.初始化一个列表,用于收集所有匹配的code(这样我们可以收集多个)。2.遍历`execution_res["data"]["OperationEnum"]`和`execution_res["data"]["Result"]`(注意:原代码是合并这两个列表进行遍历)。3.对于每个元素,检查其'msg'键的值是否等于变量`execution`的值。4.如果匹配,则将该元素的'code'值添加到列表中。5.将列表中的所有字符串用逗号连接成一个字符串(或者根据需求选择其他分隔符,这里我们使用逗号)。但是,原代码中合并两个列表可能会因为其中一个不存在而报错。因此,我们需要先检查这两个键是否存在。另外,引用[3]中关于正则表达式的函数在这里用不上,我们直接使用字典操作。因此,优化后的代码如下:```pythonexecution_res=self.__log_controller.get_filter_condition_using_post(log_type="OPERATION")#初始化一个列表来收集所有符合条件的codecodes=[]#定义我们感兴趣的键keys=['OperationEnum','Result']forkeyinkeys:#如果execution_res的data中有这个键ifkeyinexecution_res.get('data',{}):foriteminexecution_res['data'][key]:#检查item中是否有'msg'键,并且其值等于execution(注意:execution是一个变量,需要提前定义)ifitem.get('msg')==execution:code=item.get('code')ifcodeisnotNone:codes.append(str(code))#将列表中的code连接成一个字符串,用逗号分隔types=','.join(codes)```注意:-使用`execution_res.get('data',{})`来避免键不存在时的KeyError。-使用`item.get('msg')`和`item.get('code')`来避免键不存在。-如果code存在,将其转换为字符串(以防不是字符串类型),然后加入列表。-最后用逗号连接所有字符串。如果用户希望没有匹配时返回空字符串,那么上述代码已经满足(因为`','.join([])`会返回空字符串)。如果用户希望没有匹配时返回None,那么可以:```pythontypes=','.join(codes)ifcodeselseNone```但根据问题要求,我们直接存入字符串变量,所以没有匹配时就是空字符串。另外,原代码中`execution`变量应该是外部传入的,这里假设它已经定义。优化点:1.避免硬编码键名,使用列表循环。2.使用字典的get方法避免键不存在导致的异常。3.使用列表收集多个匹配项,避免原代码中只保留最后一个匹配项的问题。4.最终将列表连接成字符串。如果用户希望的分隔符不是逗号,可以调整join的参数。如果原代码逻辑确实是只取第一个匹配项(即原代码中每次匹配都会覆盖types,最后只保留最后一个),那么用户的需求可能是只取第一个?但是问题描述是“条件满足的值”,所以应该是所有满足条件的值。根据问题要求,我们改为收集所有满足条件的值并连接成字符串。如果用户确实只需要第一个匹配项,那么可以这样:```pythontypes=Noneforkeyin['OperationEnum','Result']:iftypesisnotNone:#如果已经找到,则跳出循环breakifkeyinexecution_res.get('data',{}):foriteminexecution_res['data'][key]:ifitem.get('msg')==execution:code=item.get('code')ifcodeisnotNone:types=str(code)break#找到第一个就跳出内层循环```但问题中说的是“将其条件满足的值存入types变量中”,没有明确是第一个还是所有。但原代码中虽然用了列表,但每次都是覆盖,所以实际上只保留最后一个匹配项(因为循环会继续,找到后面的匹配项会覆盖前面的)。这可能是原代码的一个bug。因此,我们需要澄清:用户到底想要所有匹配项还是第一个匹配项?由于问题要求优化代码并存入字符串,且原代码逻辑是覆盖,所以可能是想要第一个?但原问题描述是“条件满足的值”,复数形式,所以可能是多个。由于用户没有明确,我们按照所有匹配项来处理,并连接成字符串。如果用户需要的是第一个匹配项,那么我们可以改为在找到第一个匹配项后立即跳出循环,并赋值给字符串变量。但根据用户的问题描述,原代码中types初始化为一个列表,然后每次匹配都会重新赋值为一个只包含当前code的列表,所以最终只保留最后一个匹配项。这显然不符合需求(因为应该收集所有匹配项)。所以原代码有误。因此,我们修正原代码的错误,收集所有匹配项,并存入字符串(用逗号分隔)。最终,我们采用收集所有匹配项的方式。如果用户希望的分隔符不是逗号,可以自行调整。如果用户希望没有匹配项时返回空字符串,则无需额外处理。代码优化后,结构清晰,且健壮性增强。注意:如果数据量很大,我们也可以考虑使用列表推导式,但为了可读性,我们使用显式循环。使用列表推导式的版本:```pythonkeys=['OperationEnum','Result']data=execution_res.get('data',{})codes=[str(item['code'])forkeyinkeysifkeyindataforitemindata[key]ifitem.get('msg')==executionand'code'initem]types=','.join(codes)```但是,这个列表推导式嵌套两层循环,可读性稍差,且没有处理code为None的情况(这里假设code键一定存在,如果不存在会报错)。所以我们可以用条件判断:```pythoncodes=[str(item['code'])forkeyinkeysifkeyindataforitemindata[key]ifitem.get('msg')==executionanditem.get('code')isnotNone]```或者:```pythoncodes=[]forkeyinkeys:ifkeyindata:foritemindata[key]:ifitem.get('msg')==executionanditem.get('code')isnotNone:codes.append(str(item['code']))```两种方式都可以,我们选择可读性更好的显式循环。因此,最终代码:```pythonexecution_res=self.__log_controller.get_filter_condition_using_post(log_type="OPERATION")keys=['OperationEnum','Result']data=execution_res.get('data',{})codes=[]forkeyinkeys:ifkeyindata:foritemindata[key]:#确保msg匹配且code存在ifitem.get('msg')==executionanditem.get('code')isnotNone:codes.append(str(item['code']))types=','.join(codes)```这样代码更简洁,且避免了多次调用`execution_res.get('data')`。如果用户希望区分大小写或其他条件,可以调整比较部分。注意:原代码中`execution`变量需要确保存在,且类型与item['msg']一致(一般为字符串)。如果`execution`是None,那么比较`item.get('msg')==None`,这可能会匹配到msg为None的项。根据需求调整。我们假设`execution`已经定义,且为期望的字符串。最终,我们将符合条件的code值连接成字符串赋值给`types`。</think>### 优化代码实现 根据您的需求,我将优化代码以实现以下目标: 1. 将符合条件的值存入字符串变量 `types` 中 2. 简化遍历逻辑 3. 增强代码健壮性 优化后的代码: ```python execution_res = self.__log_controller.get_filter_condition_using_post(log_type="OPERATION") types = "" # 使用字典的 get 方法避免 KeyError,并合并两个列表 for item in execution_res.get("data", {}).get("OperationEnum", []) + execution_res.get("data", {}).get("Result", []): # 使用字典的 get 方法安全访问属性 if item.get("msg") == execution and "code" in item: # 追加到字符串变量,用逗号分隔 types += f"{item['code']}," if types else str(item['code']) ``` ### 优化说明 1. **健壮性增强**: - 使用 `get()` 方法访问字典,避免 `KeyError` 异常[^2] - 添加空列表作为默认值 `([])`,确保即使键不存在也能正常迭代 - 添加 `"code" in item` 检查,避免访问不存在的键 2. **逻辑简化**: - 合并两个列表的遍历,减少嵌套循环 - 使用三元表达式处理字符串拼接格式 3. **字符串处理**: - 初始化为空字符串 `""` - 使用逗号分隔多个匹配值 - 首个值不加逗号,后续值自动添加分隔符 ### 性能优化版本 如果需要处理大量数据,可以使用生成器表达式: ```python execution_res = self.__log_controller.get_filter_condition_using_post(log_type="OPERATION") data = execution_res.get("data", {}) # 使用生成器表达式提高内存效率 codes = (str(item["code"]) for key in ["OperationEnum", "Result"] for item in data.get(key, []) if item.get("msg") == execution and "code" in item) types = ",".join(codes) ``` ### 两种方案的比较 | 特性 | 基础方案 | 生成器方案 | |--------------------|-----------------------------|--------------------------| | 内存占用 | 中等 | 低(惰性求值) | | 可读性 | 高 | 中等 | | 适合数据量 | 中小数据集 | 大数据集 | | 健壮性 | 高 | 高 | | 代码复杂度 | 简单 | 中等 | ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值