音无结弦之时,天使跃动之心。立|

次林梦叶

园龄:3年3个月粉丝:22关注:3

py tips

image

from pixiv

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 中,如果你在一个类中实现了 getitemsetitem 方法,你的类将支持索引操作和项赋值操作。这意味着你可以使用方括号([])来获取和设置对象的属性.

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 中的一种迭代器。因此,生成器表达式具有迭代器的所有特性:

迭代器的特性:

  1. 惰性计算:值是按需生成的,而不是一次性生成所有值。
  2. 只能遍历一次:生成器对象在遍历完后会被耗尽,无法再次使用。
  3. 支持 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))

more details

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)
  • 条件:如果当前 xsymbol 的值)在 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 中国大陆许可协议进行许可。

posted @   次林梦叶  阅读(13)  评论(0编辑  收藏  举报
历史上的今天:
2022-08-27 Mysql----外连接,约束,索引
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起