py tips
Python Bases
Python Data Types
String and Methords
range and list and dict
dict = {'a':1, 'b':2, 'c':3, 'd':1} values = dict.values() print(values)
output: dict_values([1, 2, 3, 1])
返回dict_values对象,其是一个可迭代对象,同时可通过list(values)
得到列表
tips:
list()
是一个内置函数,任何可迭代对象(iterable)可以通过list()
转换为列表。
more detail
了解上述知识后就很好理解如下常见代码:
for i in range(5): print(i)
range 是一个内建的函数,返回的是一个 range 对象, range为可迭代对象。
所有可迭代对象均可如上使用for进行循环迭代。
上述dict.values()
是获得字典中value的方法,那有没有什么方法可以获得key呢?
dict = {'a':1, 'b':2, 'c':3, 'd':1} keys = dict.keys() print(keys)
output: dict_keys(['a', 'b', 'c', 'd'])
python中同样可以使用dict[a]
dict[a] = 2
访问和修改dict
tips: 在 Python 中,如果你在一个类中实现了 getitem 和 setitem 方法,你的类将支持索引操作和项赋值操作。这意味着你可以使用方括号([])来获取和设置对象的属性.
class MyDict: def __init__(self): self.data = {} def __getitem__(self, key): print(f"Getting value for key: {key}") return self.data[key] # 获取字典中的值 def __setitem__(self, key, value): print(f"Setting value for key: {key} to {value}") self.data[key] = value # 设置字典中的值
__getitem__
方法定义了如何通过索引来访问对象中的元素。当你使用 obj[key] 语法时,Python 会调用 obj.__getitem__(key)
方法。
__setitem__
方法定义了如何通过索引来修改对象中的元素。当你使用 obj[key] = value 语法时,Python 会调用 obj.__setitem__(key, value)
方法。
列表推导式(List Comprehension): 创建列表的语法糖, 基本结构如下:
#[expression for item in iterable if condition] nodes_values = [ { "func_name": x.func_name, "module_name": x.module_name, "cycles": x.get_cycles(), } for x in graph.nodes() ]
expression
通常为一个对象,这里为一个字典对象。
for x in graph.nodes()
即for item in iterable
生成表达式
生成器表达式是一种惰性计算的语法结构,用于按需生成值,而不是一次性生成所有值。它的语法与列表推导式(List Comprehension)非常相似,但使用圆括号 ()
而不是方括号 []
。
(表达式 for 变量 in 可迭代对象 if 条件)
示例
# 生成器表达式 gen = (x * 2 for x in range(5) if x % 2 == 0) # 输出 for value in gen: print(value)
输出:
0 4 8
生成器表达式是迭代器
生成器表达式返回的是一个生成器对象,而生成器对象是 Python 中的一种迭代器。因此,生成器表达式具有迭代器的所有特性:
迭代器的特性:
- 惰性计算:值是按需生成的,而不是一次性生成所有值。
- 只能遍历一次:生成器对象在遍历完后会被耗尽,无法再次使用。
- 支持
next()
函数:可以通过next()
逐个获取值。
gen = (x for x in range(3)) # 使用 next() 逐个获取值 print(next(gen)) # 输出 0 print(next(gen)) # 输出 1 print(next(gen)) # 输出 2 print(next(gen)) # 抛出 StopIteration 异常
Python Iterators
可迭代对象(Iterable objects)是一个容器,我们使用iter()
方法可得到迭代器(Iterator)。Lists, tuples, dictionaries, and sets这些数据类型都是可迭代对象。
在 Python 中,要使一个类成为可迭代对象(Iterable),需要在类中实现 __iter__
方法,且这个方法应该返回一个迭代器,迭代器本身必须实现 __next__
方法。
迭代器是一个包含
__iter__
方法和__next__
方法的对象。
__iter__
进行初始化操作最终返回一个迭代器
__next__
最终返回下一个元素
class MyIterable: def __init__(self, start, end): self.start = start self.end = end def __iter__(self): return self def __next__(self): if self.start >= self.end: raise StopIteration self.start += 1 return self.start - 1
上述例子中,我定义了一个类MyIterable,在__iter__
其返回了一个迭代器即自身(因为MyIterable也实现了__next__
所以MyIterable也算迭代器)。所以实现了MyIterable为一个可迭代对象。
class NodeTable: def __init__(self, nodes: Dict[str, Node] | None = None): self._nodes: Dict[str, Node] = node if nodes else {} def __iter__(self): return iter(self._nodes)
上述例子中__iter__
中因为dictionaries本身就是可迭代对象,通过iter()
得到字典的迭代器并返回,所以使得NodeTable成功实现为了可迭代对象
可迭代对象使用迭代器能够通过next
函数访问元素:
mytuple = ("apple", "banana", "cherry") myit = iter(mytuple) print(next(myit)) print(next(myit)) print(next(myit))
Python lamba表达式
df["semantics"] = df["symbol"].map( lambda x: next((k for k, v in semantics_mapping.items() if x in v), None) )
这段代码的作用是为 DataFrame 的 symbol
列创建一个新列 semantics
,其值基于 semantics_mapping
字典的映射。我将用通俗易懂的方式逐步解释每个语法元素,并提供具体示例帮助你理解。
lambda
表达式:
lambda
是 Python 中定义匿名函数的关键字,用于快速创建小型临时函数。- 语法:
lambda 参数: 表达式
- 特点:没有函数名,只能包含单行表达式,自动返回结果。
lambda x: next((k for k, v in semantics_mapping.items() if x in v), None)
- 参数:
x
是输入值(即 DataFrame 中symbol
列的每个值)。 - 表达式:
next(...)
是返回值。
next()
函数:
next(iterator, default)
用于从迭代器中获取下一个元素。- 参数:
iterator
:可迭代对象(如生成器、列表等)。default
(可选):当迭代器耗尽时返回的默认值。
生成器表达式 (k for ...)
:
- 生成器表达式用于惰性生成值,逐个产生结果,节省内存。
- 语法:
(表达式 for 变量 in 可迭代对象 if 条件)
代码中的生成器:
(k for k, v in semantics_mapping.items() if x in v)
- 遍历:
semantics_mapping.items()
的每个键值对(k, v)
。 - 条件:如果当前
x
(symbol
的值)在v
(字典值的列表)中。 - 返回值:符合条件的键
k
。
Python Pandas
Pandas Basics
Pandas Series and DataFrames
Series对象就像表格中的一列:
index | value |
---|---|
x | 1 |
y | 7 |
z | 2 |
values = [1, 7, 2] myseries = pd.Series(values, index = ["x", "y", "z"])
若去除index,即myseries = pd.Series(values)
那么下标默认为1,2,3...
除了list可以转换为series,dict同样可以转换:
dict = {"x":1, "y":7, "z":2} myseries = pd.Series(dict)
Note: The keys of the dictionary become the labels(index).即上述代码效果和上述表格一致
按照上述思路,DataFrame就像表格:
index | Name | Age | Salary |
---|---|---|---|
0 | Alice | 25 | 500 |
1 | Bob | 30 | 600 |
2 | Charlie | 35 | 700 |
列表和字典同样可以转换为DataFrame:
data1 = [ ["Alice", 25, 500], ["Bob", 30, 600], ["Charlie", 35, 700] ] df = pd.DataFrame(data1, columns=["Name", "Age", "Salary"], index=[1,2,3]) data2 = { "Name": ["Alice", "Bob", "Charlie"], "Age": [25, 30, 35], "Salary": [500, 600, 700], } df = pd.DataFrame(data2, index=[1,2,3])
simple info
df.head(n) # 表头数据 df.tail(n) # 表尾巴数据 df.info() # 总结各列数据信息 # output: <class 'pandas.core.frame.DataFrame'> RangeIndex: 3 entries, 0 to 2 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Name 3 non-null object 1 Age 3 non-null int64 2 Salary 3 non-null int64 dtypes: int64(2), object(1) memory usage: 204.0+ bytes None
本文作者:次林梦叶
本文链接:https://www.cnblogs.com/cilinmengye/p/17661003.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2022-08-27 Mysql----外连接,约束,索引