学习 Python3 语言

jhshanyu00 2020-05-16

学习 Python3 语言

第一行

Python3 开头的一行到底应该怎么写?
查阅 Google 的代码仓库,找到若干以 Python3 为主的 repo,选择比较流行的库 Trax 作为范本。随机抽取某个脚本(https://github.com/google/trax/blob/master/trax/trainer.py),该脚本的头部如下所示:

# coding=utf-8

所以今后 python3 文件的开头都将参照该规范。

标准的函数声明

LeetCode 的 Python3 模板具有较好的编码规范,如下所示是一个编码风格良好的函数声明:

class Solution:
    def shortestSubarray(self, A: List[int], K: int) -> int:
        pass

该函数接收两个参数,参数的类型分别为 List[int] 和 int,函数的返回值为 int
ref:https://leetcode-cn.com/problems/shortest-subarray-with-sum-at-least-k/

构造HTTP请求

def get_html(url):
    headers = {
        ‘User-Agent‘: r‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)‘
                      r‘Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3‘,
        ‘Connection‘: ‘keep-alive‘
    }
    req = request.Request(url, headers=headers)
    page = request.urlopen(req).read()
    page = page.decode(‘utf-8‘)
    return page

字符串前缀的语义

f-string

f-string 是 python3.6 之后版本添加的,称之为字面量格式化字符串,是新的格式化字符串的语法。
之前我们习惯用百分号 (%):

>>> name = ‘Runoob‘
>>> ‘Hello %s‘ % name
‘Hello Runoob‘

f-string 格式话字符串以 f 开头,后面跟着字符串,字符串中的表达式用大括号 {} 包起来,它会将变量或表达式计算后的值替换进去,实例如下:

>>> name = ‘Runoob‘
>>> f‘Hello {name}‘ # 替换变量

>>> f‘{1+2}‘ # 使用表达式
‘3‘

>>> w = {‘name‘: ‘Runoob‘, ‘url‘: ‘baidu.com‘}
>>> f‘{w["name"]}: {w["url"]}‘
‘Runoob: baidu.com‘

u-string

在Python2中,普通字符串是以8位ASCII码进行存储的,而Unicode字符串则存储为16位unicode字符串,这样能够表示更多的字符集。使用的语法是在字符串前面加上前缀 u。
在Python3中,所有的字符串都是Unicode字符串。所以在python3中,下面的两个字符串等价:

>>> a = ‘abc‘
>>> b = u‘abc‘
>>> a is b
True

b-string

在 python3 中,字符串前缀 b 意味着将字符串存储为 ASCII 码,无法存储中文。每个字符由底层中的一个字节(8位)来表示。

r-string

在 python3 中,字符串前缀 r 意味着将字符串中的所有字符都视为普通字符,所以主要解决的是转义字符的和特殊字符的问题。

matplotlib

折线图

from matplotlib import pyplot as plt
plt.title("Matplotlib demo") 
plt.xlabel("x axis caption") 
plt.ylabel("y axis caption") 
plt.plot(x, y)
plt.show()

logging

python3 内置日志函数包

import logging
logging.basicConfig(
    format=‘%(asctime)s - %(levelname)s - %(name)s - %(message)s‘,
    datefmt=‘%m/%d/%Y %H:%M:%S‘,
    filemode=‘w‘,
    level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info("[content]%s" % (html))

argparse

首先,需要导入 argparse 库,并且声明一个参数解析器。

import argparse
parser = argparse.ArgumentParser()

其次,参数分为两种,一种是位置参数,一种是可选参数。位置参数是运行程序的必填项。

# Positional arguments
parser.add_argument("train", type=str,
 help="training data path, i.e. ctb8 and 1998")
parser.add_argument("embedding", type=str,
 help="word embedding path")

第二种是可选参数,区别在于加入了“--”前缀。

# Optional arguments
parser.add_argument("--sep", default=0, type=int,
 help="the separators of training data, split token and label, 0 for _(default), 1 for /")
parser.add_argument("-ml", "--max_len", default=50, type=int,
 help="length of training data sequence, default is 50")
parser.add_argument("-e", "--epochs", default=3, type=int)
args = parser.parse_args()

最后,获得用户的输入很简单,如下所示。

seperator = ‘_‘ if args.sep is 0 else ‘/‘

Ref: https://docs.python.org/3.7/howto/argparse.html

numpy

pad

import numpy as np
x = np.random.normal(size=(2,2))
np.pad(x, ((0,1), (1,0)), ‘constant‘)

在填充(pad)前,x 的值如下所示:

array([[-1.04965022, 1.50657074],
       [-0.95876126, -0.46918995]])

填充后,x 的值如下所示:

array([[ 0. , -1.04965022, 1.50657074],
       [ 0. , -0.95876126, -0.46918995],
       [ 0. , 0. , 0. ]])

pad 有三个参数:

  1. 待填充的 numpy ndarray
  2. 每个维度上 before 和 after 的填充数量
  3. 填充值

第二个参数需要着重介绍。array_like,每个 tuple 表达了在该维度上的 before 填充数和 after 填充数。

(
    (上, 下), # 第一个维度
    (左, 右), # 第二个维度
    ......
)

相关推荐