Python笔记。

语言特性

参数解包

PEP 448 – Additional Unpacking Generalizations:将参数从集合中拿出来参与计算。

1
2
3
4
5
6
7
8
>>> print(*[1], *[2], 3)
1 2 3
>>> dict(**{'x': 1}, y=2, **{'z': 3})
{'x': 1, 'y': 2, 'z': 3}
>>> {'x': 1, **{'x': 2}}
{'x': 2}
>>> {**{'x': 2}, 'x': 1}
{'x': 1}

运算符

算术

  • ** 幂 - 返回x的y次幂 a**b 为10的20次方, 输出结果 100000000000000000000
  • // 取整除 - 返回商的整数部分(向下取整) 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0

比较

  • != 不等于 - 比较两个对象是否不相等 (a != b) 返回 true.
  • <> 不等于 - 比较两个对象是否不相等 (a <> b) 返回 true。这个运算符类似 != 。

逻辑

  • and x and y 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 (a and b) 返回 20。
  • or x or y 布尔"或" - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。 (a or b) 返回 10。
  • not not x 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 not(a and b) 返回 False

成员

  • in 如果在指定的序列中找到值返回 True,否则返回 False。 x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
  • not in 如果在指定的序列中没有找到值返回 True,否则返回 False。 x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

身份

  • is is 是判断两个标识符是不是引用自一个对象 x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False
  • is not is not 是判断两个标识符是不是引用自不同对象 x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。

字符串前使用u,r,b标记

  • u/U:表示unicode字符串
1
2
3
4
>>> print('你好')
你好
>>> print(u'你好')
你好
  • r/R:正则表达式,使用原始字符串,不转义
1
2
3
4
5
>>> print('\n \t sss')

 	 sss
>>> print(r'\n \t sss')
\n \t sss
  • b:bytes,表示该字符串为字节,即每个字符占用一个字节 比如IO接收到的内容就是字节流,此时的内容就应当是经过编码后的字节:
1
2
'内容'.encode('utf-8')
>>>b'\xe5\x86\x85\xe5\xae\xb9'

三元运算符

条件表达式。

1
2
3
>>> word='before' if 1>2 else 'after'
>>> print(word)
after

列表生成式

列表解析式。比如现在有一个需求,对(1,11)的列表每个元素进行-1操作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 首先生成一个列表
>>> container=list(range(1,11))
>>> print(container)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 传统思路是对列表进行循环
>>> empty=[]
>>> for x in container:
...     empty.append(x-1)
...     
>>> empty
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 使用列表生成式,对每个元素直接处理
>>> [x-1 for x in container]
>>> [x-1 for x in range(1,11)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 后面还可以对元素进行条件判断,比如3的倍数才进行处理
>>> [x-1 for x in container if x%3==0]
[2, 5, 8]
# 还可以对多个`iterable`进行操作,如下可以生成两个集合的笛卡尔积
>>> [x+y for x in '123' for y in 'abc']
['1a', '1b', '1c', '2a', '2b', '2c', '3a', '3b', '3c']
# 同理可以将`dict`一次转为`list`
>>> dictVar={'1':'a','2':'b'}
>>> print(dictVar)
{'1': 'a', '2': 'b'}
>>> listVar=[k+'->'+v for k,v in dictVar.items()]
>>> listVar
['1->a', '2->b']

lambda函数

匿名函数。

1
2
3
4
5
6
7
8
# 还是以上述列表生成式中的需求为例,借助`map`处理每个元素
>>> list(map(lambda x:x-1, container))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 等同于
>>> list(x-1 for x in container)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [x-1 for x in container]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

SimpleHTTPServer

Python自带的一个简易版web-server。

官方文档

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import SimpleHTTPServer
import SocketServer

PORT = 8000

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "serving at port", PORT
httpd.serve_forever()

不推荐在生产环境使用,只适用于小型或者基本服务的搭建试用,所以可以直接用-m命令启动:

1
2
3
python -m SimpleHTTPServer 8000
# python3
python3 -m http.server 8000

之后即可直接访问:http://IP:端口号/,web根路径就是执行命令的那个目录。

json

使用python处理一些json的问题检查很方便。注意,从java日志中贴过来的json,需要把null替换为None

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/python3
import json
 
# Python 字典类型转换为 JSON 对象
data = {
  "header": {
    "code": "200",
    "desc": "success"
  },
  "body": {
    "total": 489,
    "pageIndex": 3,
    "msg": "success",
    "pageSize": 200,
    "dataList": [
      {
          "key":666,
          "other":888
      },
      {
          "key":666,
          "other":888
      },
      {
          "key":666,
          "other":888
      },
      {
          "other":888
      },
      {
          "key":None,
          "other":888
      }
    ]
  }
}
json_str = json.dumps(data)
# print ("Python 原始数据:", repr(data))
# print ("JSON 对象:", json_str)

# print(data['body']['dataList'])
# 这里我们检查上述json结构dataList的每一项,查看不存在 "key"的dict项,或者值空的数据
[print(dataItem) for dataItem in data['body']['dataList'] if ("key" not in dataItem.keys() or dataItem["key"]==None)]

qrcode

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/python3
# -*- coding:UTF-8 -*-
###############################################################################
# pip install qrcode
# 命令行二维码工具
#
# :author:: DragonSong 📅: 2022/3/4
#

import qrcode

def printQR(str):
      qr = qrcode.QRCode()
      qr.border = 1
      qr.add_data(str)
      qr.make()
      qr.print_ascii(out=None, tty=False, invert=False)


if __name__ == "__main__":
    str = input("请输入你要encode为二维码的字符:")
    printQR(str)

文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
with open('/Users/dragonsong/Downloads/code-repo/dragonsong031100/content/posts/methodology/work/make-a-great-meeting/freemind.txt') as fp:
   line = fp.readline()
   while line:
       str_arr = line.split(' ')
       for ele in str_arr:
             if "TEXT" in ele:
                   print(ele.replace("TEXT=","").replace("\"",""));
       line = fp.readline()


#conding=utf8  
import os 

directory = os.walk(r"/Users/dragonsong/Desktop/dir")  

for path,dir_list,file_list in directory:  
    for file_name in file_list:  
        print(file_name)

        suffix = os.path.splitext(file_name)[1]
        if suffix == '.record_dat':
            print(file_name)
            os.rename((path+ os.sep + file_name),(path+ os.sep + file_name+'.mp4'))

# concat 拼接操作
content = []
with open('/Users/dragonsong/Downloads/zeus_2022_2_23.csv', 'r') as f:
    for line in f.readlines():
        line_list = line.strip('\n').split(',')     # 去除换行符,以制表符分隔
        new_c = line_list[2]+'("'+line_list[1]+'","'+line_list[0]+'"),'
        print(new_c)