Python使用小技巧

如何将字典类型的字符串转为字典

我们知道一些双属性的集合或列表等能够转为字典,要是一个字典类型的字符串怎么转为字典呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
In [36]: import ast

In [37]: user = '{"name" : "john", "gender" : "male", "age": 28}'

In [38]: user_dict = ast.literal_eval(user)

In [39]: user_dict
Out[39]: {'age': 28, 'gender': 'male', 'name': 'john'}

In [40]: user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}"

In [41]: user_dict = ast.literal_eval(user_info)

In [42]: user_dict
Out[42]: {'age': 28, 'gender': 'male', 'name': 'john'}

参考文章:Python将字符串转为字典

vim跳转到最后一行或者跳转到行首

第一种方式:

  • :$跳转到最后一行
  • :1跳转到第一行

第二中方法:

  • shift + g跳转到最后一行
  • gg跳转到第一行
Python中glob模块的使用

glob模块可以按照指定路径得到所有符合条件的文件的完整路径。基本使用如下统配符进行操作:

  • *星号:表示匹配0个或者多个字符
  • ?问号:表示匹配单个字符
  • []中括号:匹配指定的范围 如[0-9]

glob.glob

1
2
3
4
5
6
7
8
9
10
11
12
In [14]: import glob

In [15]: files_path = glob.glob("/tmp/com*")
# 返回值是一个 list
In [16]: type(files_path)
Out[16]: list

In [17]: for file_path in files_path:
...: print(file_path)
...:
/tmp/com.apple.launchd.m9yNIck6do
/tmp/com.apple.launchd.SuQ43hXSeM

glob.iglob

iglob方法返回的是一个可迭代对象,相比列表更加省内存和高效。

1
2
3
4
5
6
7
8
9
10
11
12
In [20]: import glob

In [21]: files_path = glob.iglob("/tmp/com*")

In [22]: type(files_path)
Out[22]: generator

In [23]: for file_path in files_path:
...: print(file_path)
...:
/tmp/com.apple.launchd.m9yNIck6do
/tmp/com.apple.launchd.SuQ43hXSeM
Python 读取和写入yaml文件

安装pyyaml模块

1
pip install pyyaml

查看一下yaml文件

1
2
3
4
5
6
7
8
9
10
11
# cat eg.yaml
name: Tom Smith
age: 37
spouse:
name: Jane Smith
age: 25
children:
- name: Jimmy Smith
age: 15
- name1: Jenny Smith
age1: 12

编写读取文件

1
2
3
4
5
6
# cat py_yaml.py
import yaml


with open("eg.yaml", "r") as loadfile:
print(yaml.load(loadfile))

输出结果为Python的字典格式

1
{'name': 'Tom Smith', 'age': 37, 'spouse': {'name': 'Jane Smith', 'age': 25}, 'children': [{'name': 'Jimmy Smith', 'age': 15}, {'name1': 'Jenny Smith', 'age1': 12}]}

将读取的字典重新写入yaml文件

1
2
3
4
5
6
7
8
9
# cat py_yaml.py
import yaml


with open("eg.yaml", "r") as loadfile:
python_dict = yaml.load(loadfile)

with open("out.yaml", "w") as dumpfile:
dumpfile.write(yaml.dump(python_dict))

查看输出的yaml文件

1
2
3
4
5
age: 37
children:
- {age: 15, name: Jimmy Smith}
- {age1: 12, name1: Jenny Smith}
name: Tom Smith
Python内置函数详解

image-20190124223812281

推荐阅读参考文章: Python内置函数详解

Python中垃圾回收和del语句

我们知道Python中的垃圾回收是通过引用计数来完成的,当一个对象的引用计数为0的时候,Python的垃圾回收机制就会将对象回收。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
In [27]: a = "larry"

In [28]: b = a

In [29]: id(a)
Out[29]: 4398991432

In [30]: id(b)
Out[30]: 4398991432

In [31]: del a

In [32]: id(b)
Out[32]: 4398991432

In [33]: id(a)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-33-cb6738f404b5> in <module>()
----> 1 id(a)

NameError: name 'a' is not defined

larry这个字符串对象,在第一行被贴了a标签之后,引用计数为1。然后又贴上了b标签,此时字符串对象的引用计数为2。

当我们调用了del相当于把指向字符串对象的一个标签给撕掉了。因此,del语句操作某个对象的时候, 并不是直接将该对象在内存中删除, 而是将该对象的引用计数-1

我们看到当我们即使使用del删除了a变量(标签)内存中实际的字符串对象并没有被删除, del语言只是删除了一个变量对该字符串对象的引用, 所以对于larry这个字符串对象来说, 效果只是引用计数-1

魔法函数del

类中的__del__魔法函数, 支持我们自定义清理对象的逻辑, 当Python解释器使用del语言删除类的对象的时候, 会自动调用类中的__del__函数, 我们可以对其进行重载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
In [36]: class Ref:
...: def __init__(self, name):
...: self.name = name
...: def __del__(self):
...: print("删除对象")
...: del self.name
...:

In [37]: r = Ref(name="larry")

In [38]: r.name
Out[38]: 'larry'

In [39]: del r
删除对象

In [40]: r.name
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-40-3d2a54766126> in <module>()
----> 1 r.name

NameError: name 'r' is not defined

通过重载__del__魔法函数,我们可以控制在del对象的时候执行哪些善后操作

函数的默认参数为可变对象的时候
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
In [62]:  class Company:
...: def __init__(self, name: str, staffs: list = []):
...: self.name: str = name
...: self.staffs: list = staffs
...: def add(self, staff_name: str):
...: self.staffs.append(staff_name)
...:

In [63]: Company.__init__.__defaults__
Out[63]: ([],)

In [64]: co1 = Company("xiaomi")

In [65]: co1.add("d")

In [66]: Company.__init__.__defaults__
Out[66]: (['d'],)

In [67]: co2 = Company("o")

In [68]: co2.add("E")

In [69]: Company.__init__.__defaults__
Out[69]: (['d', 'E'],)

当函数的参数没有指定值的时候, 就会指向Company.__init__.__defaults__这里的默认值

Python冒泡 选择 插入排序算法详解

Python冒泡 选择 插入排序算法详解

python处理XML文件

python处理XML文件

Python的正则表达式模块re

Python的正则表达式模块re

知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!