Python 随记

Python 程序入口

有时候我们会看到

1
2
3
if __name__ == '__main__':
dosomething()
# ...

这个语句中, __name__ 是当前模块名,当模块被直接运行时模块名为 __main__

这句话的意思就是,当模块被直接运行时,dosomething()块将被运行,当模块是被导入时,dosomething()块不被运行。

-m 参数

python xxx.pypython -m xxx.py ,这两种运行 Python 程序的方式的不同点在于,一种是直接运行,一种是当做模块来运行。

  • 直接运行的时候,xxx.py 所在目录是 sys.path
  • 以模块运行的时候,当前工作路径是 sys.path

直接参数

有时候我们用命令行运行 python 程序,如:

1
python test.py jerry 20

这里的 jerry 和 20 都是参数,在 python 里面用 sys 模块来获取参数:

1
2
3
4
5
import sys

filename = sys.argv[0] # test.py
user = sys.argv[1] # jerry
age = sys.argv[2] # 20

参考:


python 3.6 print新特性: Formatted string literals

使用 %

在 python 3.6 之前,我们想 print , 一般是用 % 符号

1
2
3
name = "jerry"
age = 18
print("my name is %s, and I am %d years old" % (name, age))

使用 {}

在 python 3.6 可以用 {} ,类似于 kotlin 语法

  • 注意: 引号前面有个 f
1
2
3
name = "jerry"
age = 18
print(f"my name is {name}, and I am {age} years old")

可以在 {} 里运算

1
2
3
4
width = 10
precision = 4 # 有效数字
value = decimal.Decimal("12.34567")
print(f"result: {value:{width}.{precision}}") # nested fields

输出:12.34 (4位有效数字)

参考


获取输入参数

用 sys.argv[] 来获取输入参数

myinfo.py

1
2
3
4
5
import sys

name = sys.argv[1]
age = sys.agrv[2]
print(f"my name is {name}, and I am {age} years old")

终端输入

1
$ python3 myinfo.py jerry 18

终端输出

1
$ my name is jerry, and I am 18 years old
  • myinfo.py 本身是一个参数, 即 argv[0]
  • jerry 是argv[1]
  • 18 是argv[2]
  • 注意: 输入参数都是 string 类型, 这里的 18 其实是字符串18,不是数字18,可以用int(sys.agrv[2]) 转换成数字18

切片(Slice)操作

有一个 List

1
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']

切片操作

1
2
3
4
5
6
# 取出前3个元素
L[0:3] # ['Michael', 'Sarah', 'Tracy']
L[:3] # 其中,0可以省略

# 取出下标为1(包含)到 4(不包含)的元素
L[1:4]

倒数切片

1
2
# 取出-2(包含)到0(不包含)
L[-2:0] # ['Bob','Jack']

还可以每隔两个数取一个

1
2
3
# 下标为0(包含)到10(不包含)
L[0:10:2]

如果看到下面这种操作,表示所有数每隔5个取一个

1
L[::5]

tuple

tuple 是另一种有序列表,中文叫元组。它也可以切片操作,操作结果仍为 tuple。 tuple 跟 list 的区别在于一旦初始化便不可更改。

看一个 tuple 例子

1
2
3
4
5
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

在这个例子中, t[0] 表示 tuple 的第一个元素,也就是 'a', t[1] 表示 'b', t[2]表示 ['A', 'B']


连接数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pymysql


connect = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="YOURPASSWD", db="YOURDBNAME")

cursor = connect.cursor()

sql = "SELECT * FROM rate"

cursor.execute(sql)
results = cursor.fetchall()

file = open("C:\\Users\\JerrySheh\\IdeaProjects\\mall\\dataset\\douban_large_clean.dat", "w")

for row in results:
userid = str(row[0])
bookid = str(row[1])
rating = str(int(row[2]))
line = str(userid + "::" + bookid + "::" + rating + "\n")
print(line)
file.write(line)

file.close()