首页 > 编程语言 >Python 入门之阅目的 Pythonic(一)

Python 入门之阅目的 Pythonic(一)

时间:2024-05-31 09:22:40浏览次数:22  
标签:注释 Pythonic abc 之阅 Python 空格 3.4 collections

# 免责声明:
    本文内容主要是肥清大神的视频以及自己收集学习内容的整理笔记,目是主要是为了让象博主这样的老白能更好的学习编号,如有侵权,请联系博主进行删除。

1. 注释

# 注释<Comments>: 用来向用户提示或解释某些代码的作用和功能
    * 可以出现在代码中的任何位置
    * Python 解释器在执行代码时会忽略
# 在调试<Debug>程序时可以用来临时移除无用的代码
# 提高程序的可读性
# 一般情况下,合理的代码注释应该占源代码的 1/3 左右
    * 注释不一定要有
	* 只有必要时才写注释

1.1. 格式

# 以 # 开头 

1.2. 要求

# # 与注释之间用一个空格间隔
# 最多72 ~ 80 个字符/行
    * URL 除外
# 最好是一个完整的句子
# 变更代码时要注意更新注释

1.3. 种类

1.3.1. 内联注释

# 内联注释<Inline Comment>: 
    * 通常用于描述一行代码的目的/解析性的描述/提示/警告
    * 确保做开发时候的一些隐藏的功能/逻辑
    * 与在代码在一行
    * # 代码间隔两个空格

1.3.1.1. 约定

# PEP8 约定对内联注释的规定: 
    * 仅在必要时使用内联注释,否则避免
    * 它们应该与它们引用的代码位于同一行的末尾
    * 为了便于阅读,代码和注释之间应该至少有两个或多个空格
    * 与块注释类似,内联注释以<#>开头,然后是一个空格
    * 避免使用内联注释过度解释明显的逻辑

1.3.1.2. 实例

count = 100  # This is the number for caculating the books

1.3.2. 块注释

# 块注释<Block comments>: 
    * 通常是多行
    * 在代码之前
        * 为读者提供了现在代码片段的目的
        * 讲清楚 'What
    * 解析一些功能性的/细节性的内容
	    * 为什么用这个标题
        * 功能块架构的描述
        * 数据库的功能描述

1.3.2.1. 约定

# PEP8 约定了块注释的以下准则: 
    * 注释的缩进应该与它的代码块的缩进级别相匹配
    * 每个注释行都应以<#>开头,后跟一个空格,然后再开始文本
    * 多个段落应该用一个以<#>开头的空白注释行分隔,而不仅仅是一个空白行

1.3.2.2. 实例

# Add comment for your codes
# Block comment tutorial

from typing import Iterator

def read_lines_from_file(path: str) -> Iterator[str]:
    # Read every line from the given file,
    # it just handles the rows which is not blank,
    # it should ignore the newline character
    # 
    # By the way, it should not check the ecistence of the given file
    # let the invoker to handle the raises if it does not exists that file
    # 
    # the file readline document below
    # see: https://jupter-docker-stacks.readthedocs.io/en/lotest/using/selecting.html
	
	with open(path, 'r') as file:
        while line:= file.readline():
                line = line.strip()
                if line:
                    yield line
                    
file_path = 'demo.txt'
for line in read_lines_from_file(file_path):
    print(line)

2. DocString

# 文档字符串<DocStrings>是一种 Python 格式的字符串,用于解释文档程序,解释对应的功能如何使用或者操作帮助程序文档更加简单易懂
    * PEP 257 很清楚的解释了文档字符串的协议和用法
    * Python 中的动态类型特性使得文档字符串的使用变得非常重要
    * 可以使用 __doc__ 属性调用函数中的文档字符串

2.1. 格式

# 用一对三个连续的单引号<'''>或三个连续的双引号<""">来定义文档字符串

2.2. 位置

# 在 Python Class/模块/方法的首行

2.3. 实例

def difference(a: set, b: set) -> list:
    """
    :param a: 求差前一个集合
    :param b: 求差后一个集合
    :return:
    """
    pass

print(difference.__doc__)
    :param a: 求差前一个集合
    :param b: 求差后一个集合
    :return:

3. 注解

# 注解<annotations>: 启用 Python 中的类型提示功能, 向应用程序用户提供参数及其关联的数据类型
    * 在 PEP 3107 中在 Python 中引入的
    * 允许指定预期变量的类型
    * 允许指定任何有助于更好地了解数据所代表内容的元数据
    * 只是一种类型提示, 对运行实际上是没有影响
    * 在 Python 3.5+ 中,对类型和注解进行了相应的更新

3.1. 注解类型

3.1.1. 内置类

# Python 3.9 之后的版本在内置的容器类支持定义内部元素的具体类型
# None: 空值或不存在的值
# str: 字符串
# bytes: 字节
# bytearray: 字节数组
# int: 整型
# float: 浮点型
# bool: 布尔
# list: 列表
# tuple: 元组
# dict: 字典
# set: 集合
# frozenset: 不可变集合
# type1 | type2 | type3...: typing.Union[] 简化形式
    * 建议采用此模式

3.1.2. typing 模块

# typing.Any: 任意类型
# typing.AnyStr: 用于可接受 str 或 bytes 参数但不允许两者混用的函数
# typing.Union[X[, Y, ...]]: 联合类型
# typing.Optional[X]: 可选参数
    * Python 3.10 引入
# typing.ClassVar: 用于标注类变量 
# typing.LiteralString: 只包括字符串字面值
    * Python 3.11 添加
# typing.Self: 通常用于类中返回 self 的方法的返回值
    * 通常不用于注解形参
    * Python 3.11 添加

3.1.3. collections 模块

# collections.deque: 双端队列
# collections.defaultdict: 默认值字典
# collections.Counter: 计数器
# collections.ChainMap: 链映射

3.1.4. collections.abc 模块

# collections.abc.Generator: 生成器
# collections.abc.Iterable: 迭代对象
# collections.abc.Iterator: 迭代器
# collections.abc.Sequence: 只读序列
# collections.abc.MutableSequence: 可变序列
# collections.abc.Callable: 可调用对象
    * 通常用于注解函数类型
# collections.abc.Set: 只读集合 
# collections.abc.MutableSet: 可变集合
# collections.abc.Mapping: 映射类型
    * 键值对的类型
# collections.abc.MutableMapping: 可变映射
# collections.abc.MappingView: 映射视图
# collections.abc.KeysView: 映射键的视图
# collections.abc.ItemsView: 映射项目的视图
# collections.abc.ValuesView: 映射值的视图
# collections.abc.Awaitable: 可等待对象
# collections.abc.Coroutine: 协程对象
# collections.abc.AsyncIterable: 异步迭代对象
# collections.abc.AsyncIterator: 异步迭代器
# collections.abc.AsyncGenerator: 异步生成器
# collections.abc.Buffer: 缓冲区类型
    * bytes | bytearray | memoryview 字节序列的并集
	* Python 3.12 引入

3.1.5. contextlib 模块

# contextlib.AbstractContextManager: 
# contextlib.AbstractAsyncContextManager: 

3.1.6. re 模块

# re.Pattern:  
# re.Match: 

3.2. 格式

3.2.1. 变量

# 变量名: 注解类型[ = 默认值]
    * 要求: 
        * 变量名和冒号无空格
        * 冒号和注解类型间有一个空格
        * 默认值的 = 前后各有一个空格

3.2.2. 形参

# 形参名: 注解类型[ = 默认值]
    * 要求: 
        * 形参名和冒号无空格
        * 冒号和注解类型间有一个空格
        * 默认值的 = 前后各有一个空格

3.2.3. 返回值

# -> 注解类型: 
    * 要求: 
        * -> 前后各有一个空格
        * 注解类型和冒号之间无空格

3.3. __ annotations __

# 引入注解会自动添加的一个特殊属性<__annotations__>
    * 功能: 提供了一个 API 以字典形式访问已定义注解的名称-值对
    * 调用方式: 
        * function_name.__annotations__
        * class_name.__annotations__
    * 特性: 
        * 只能捕获被标注的参数
    * 实例: 
 # -*- coding: UTF-8 -*-


def foo(a: int, b: str, c=None) -> int:
    pass

print(foo.__annotations__)  # {'a': <class 'int'>, 'b': <class 'str'>, 'return': <class 'int'>}

3.4. 检查

3.4.1. Pylint

# 静态分析工具
# 主要用于检验编码风格是否符合 PEP-8 规范

3.4.1.1. 安装

3.4.1.1.1. Windows
# pip install pylint
    * 直接在 cmd 下使用
    * 若 pip 不可用, 安装最新版 Python,或者找到 pip 的安装脚本先装 pip
# 安装位置: Python 安装目录下的 /Scripts/ 下
    * 此路径自动添加到环境变量 PATH
3.4.1.1.2. Linux
# $ sudo pip install pylint 
    * 直接在 Terminal 中使用
# 安装位置: /usr/bin/pylint

3.4.1.2. 配置

# 以 PyCharm 2024.1.1 为例: 
# File > Settings... > Tools > External Tools

image
image
image

# Program: 指向 pylint 的实际目录
    * 此处以 Windows 为例
        * "C:\Programs\Python\Python312\Scripts\pylint.exe"
# Parameters: --output-format=parseable --disable=R --disable=C0102,C0103,C0111,C0301,C0302,C0303,C0304,C0305,W0120,W0123,W0401,W0603,W0612,W0614,W0621,W0622,W0703,E1003,E1101 $FilePath$
    * 根据情况选择 pylint 输出信息显示格式和要 disable 的项目
    * 为了防止 Pylint 打印找不到 配置文件的 warning
        * 可以在当前工程目录下新建一个空的文件,取名为 .pylintrc
        * 在上述参数中加入选项 --rcfile=path/to/.pylintrc 即可
# Working directory: $FileDir$

3.4.1.3. 评估代码质量

# 写完一个脚本后, 直接右键单击
# 选择 External Tools > Pylint
# 运行可得到当前代码质量和改进建议

image

3.4.2. MyPy

# 静态类型检查工具
# 

3.4.2.1. 安装

# pip install mypy

3.4.2.2. 配置

# 以 PyCharm 2024.1.1 为例: 
# File > Settings... > Tools > External Tools

image
image
image

# Program: 指向 mypy 的实际目录
    * 此处以 Windows 为例
        * "C:\Programs\Python\Python312\Scripts\mypy.exe"
# Parameters: $FilePath$
# Working directory: $FileDir$

3.4.2.3. 评估代码质量

# 写完一个脚本后, 直接右键单击
# 选择 External Tools > MyPy
# 运行可得到当前代码质量和改进建议

image

3.4.3. Black

# 静态检验工具
# Python 官方出品
# 检查代码是否符合 PEP8 规范
# 格式化整个文件或指定目录
# 使用方式相对简单

3.4.3.1. 安装

# pip install black

3.4.3.2. 配置

# 以 PyCharm 2024.1.1 为例: 
# File > Settings... > Tools > External Tools

image
image
image

# Program: 指向 black 的实际目录
    * 此处以 Windows 为例
        * "C:\Programs\Python\Python312\Scripts\black.exe"
# Parameters: $FilePath$
# Working directory: $FileDir$

3.4.3.3. 评估代码质量

# 写完一个脚本后, 直接右键单击
# 选择 External Tools > black
# 运行可得到当前代码质量和改进建议

image

3.4.4. Flake8

# 静态检验工具

# 检查代码是否符合 PEP8 规范

3.4.4.1. 安装

# pip install flake8

3.4.4.2. 配置

# 以 PyCharm 2024.1.1 为例: 
# File > Settings... > Tools > External Tools

image
image
image

# Program: 指向 mypy 的实际目录
    * 此处以 Windows 为例
        * "C:\Programs\Python\Python312\Scripts\flake8.exe"
# Parameters: $FilePath$
# Working directory: $FileDir$

3.4.4.3. 评估代码质量

# 写完一个脚本后, 直接右键单击
# 选择 External Tools > Flake8
# 运行可得到当前代码质量和改进建议

image

3. 命名约定

# 常量: 全是大写字母
# 类名: 驼峰式
# 其余: 小写字母

4. 布局

4.1. 空行

# 尽可能多用缩进和分行

4.1.1. 间隔两个空行

# 类与类之间
# 类与顶级函数之间

4.1.2. 间隔一个空行

# 类内部的方法之间
# 方法内部流程的各个步骤之间

4.2. 每行最大字符长度和分行符

# 最大字符长度: 79字符/行
# 分行符: \
    * 在要换行的位置直接回车
    * 一般在二元运算符之前进行分行

4.3. 缩进

# 用 4 个连续的<空格>代表缩进
# 优先使用 空格
	* 确保在不同编辑器之间的一致性
# 不允许 Tabs 和 空格 混用

4.3.1. 分行后缩进

4.3.1.1. 括号与参数在同一行

# 分行后参数与上一行参数起点对齐
foo = long_funciton_name(var_one, var_two,
                         var_three, var_four)

4.3.1.2. 括号与参数不在同一行

# 分行后参数缩进多一级
	* 与函数语句体区分开
def long_funciton_name(
		var_one, var_two, var_three, 
    	var_four):
    print(var_one)

4.3.1.3. 悬挂缩进

# 语句中除第 1 行外的语句都缩进
foo = long_funciton_name(
    var_one, var_two,
	var_three, var_four)

4.3.2. 技巧

# 条件语句的缩进
if (this_is_one_thing
   		and that_is_another_thing):
    do_something()

4.4. 定位闭合括号

# 指右括号
# 与上一行的第 1 个非空白字符对齐
my_list = [
    1, 2, 3,
    4, 5, 6,
	]

# 与语句最初始的字符对齐
my_list = [
    1, 2, 3, 
    4, 5, 6,
]

4.5. 表达式/语句中的空格

# 直接在括号内书写, 括号与内容间无空格
spam(ham[1], {egg: 2})

# 逗号结尾的也不要加空格
foo = (0,)

# 冒号/逗号/分号用来分隔语义时前面也不要加空格
if x == 4: print(x, y); x, y = y, x

# 切片操作时, 冒号两侧的间距要相等
	* 冒号两侧无空格
ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:]
    * 冒号两侧空格相等
ham[1 : 9], ham[1 : 9 : 3], [: 9 : 3], ham[1 :: 3], ham[1 : 9:]

# 函数与参数括号间无空格
span(1)

# 索引/切片/键名的括号与相应变量间无空格
dct['key']
lst[0]
lst[:-1]

# 赋值操作两边各留一个空格
x = 1
y = 2

# 二元运算符/比较运算符两侧各有一个空格
i = i + 1
submitte += 1

# 使用具有不同优先级的运算符, 只在具有最低优先级的运算符两边添加空格
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)

# 函数定义中参数与类型之前要留空格
def munge(input: AnyStr):

# 返回值的 -> 两侧要各留一个空格
def munge(input: AnyStr) -> str:

# 返回值类型与冒号之前不留空格
def func() -> str:
    
# 函数定义中的关键字参数和默认值之间不留空格
def compley(real, image=0.0):
    
# 函数定义中, 注解类型和默认值之间的等号两侧各留一个空格
def mnuge(input: AnyStr = None, sep: Any = None, limit=1000):
    
# 避免增加尾部空格

标签:注释,Pythonic,abc,之阅,Python,空格,3.4,collections
From: https://www.cnblogs.com/matrix-1999/p/18221993

相关文章

  • pip is configured with locations that require TLS/SSL, however the ssl module in
     [root@dsc1mydjango]#pip3installdjangopipisconfiguredwithlocationsthatrequireTLS/SSL,howeverthesslmoduleinPythonisnotavailable.CollectingdjangoRetrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))after......
  • Python——聊天机器人
    前端代码1#导入需要的包和库2fromchatterbotimportChatBot3fromchatterbot.trainersimportListTrainer,ChatterBotCorpusTrainer4fromflaskimportFlask,render_template,request56#创建Flask应用7app=Flask(__name__)89#创建一个聊......
  • 【Python快速上手(三十四)】- Python math 模块
    目录Python快速上手(三十四)-Pythonmath模块Pythonmath模块详解1.导入math模块2.基本数学运算3.三角函数4.双曲函数5.特殊函数6.浮点运算辅助函数7.常量8.实际应用案例9.小结Python快速上手(三十四)-Pythonmath模块Pythonmath模块详解math模块......
  • 数据分享|python分类预测职员离职:逻辑回归、梯度提升、随机森林、XGB、CatBoost、LGB
    全文链接:https://tecdat.cn/?p=34434原文出处:拓端数据部落公众号分析师:ShilinChen离职率是企业保留人才能力的体现。分析预测职员是否有离职趋向有利于企业的人才管理,提升组织职员的心理健康,从而更有利于企业未来的发展。解决方案任务/目标采用分类这一方法构建6种模型对职......
  • Python实训的心路历程——第4天
    时间过得好快,转眼就第四天了,今天还是接着做界面,并往里面添加内容。========================================一天又过去了,但是每天都感觉自己成长了好多呢,哈哈来汇总一下今天的工作和收获今天把界面和一些基础的功能写完了,程序能正常跑了,可以处理实时摄像头、视频、图片三种......
  • Python信贷风控模型:梯度提升Adaboost,XGBoost,SGD, GBOOST, SVC,随机森林, KNN预测金
    原文链接:http://tecdat.cn/?p=26184 原文出处:拓端数据部落公众号最近我们被客户要求撰写关于信贷风控模型的研究报告,包括一些图形和统计输出。在此数据集中,我们必须预测信贷的违约支付,并找出哪些变量是违约支付的最强预测因子?以及不同人口统计学变量的类别,拖欠还款的概率如何......
  • Python selenium webdriver
    元素定位第一步,导入selenium模块的webdrivier包importtimefromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy窗口最大化driver=maximize_window()第二步,调用webdriver包的Chrome类,返回chrome浏览器对象driver=webdriver.Chrome()第三步,如使用......
  • python连接数据库
    一#删除数据库importpymysqlmydb=pymysql.connect(host="localhost",user="root",password="000000",database="my_db")mycursor=mydb.cursor()sql="DROPDATABASEIFEXISTSmy_db"mycursor.execute(sql)m......
  • 「Python魔法药剂:列表推导式的秘密配方大公开!」(一)
    嗨,我是阿佑,最近给大家打开了python操作数据库的大门,今天阿佑将为你揭开列表推导式这个秘密配方的神秘面纱。通过一系列生动有趣的案例和深入浅出的解释,阿佑将带你领略列表推导式的无穷魅力。准备好了吗?让我们一起调配出最强大的编程药剂,让你的代码魔法无人能敌!文章目录......
  • 「Python魔法药剂:列表推导式的秘密配方大公开!」(二)
    嗨,我是阿佑,上一篇给大家讲了《Python魔法药剂——列表推导式(一)》,今天给大家解锁剩下的全部内容!在Python编程的世界中,列表推导式就是那个能让你脱颖而出的秘籍。但如何掌握它,如何运用它解决实际问题?今天阿佑将为你揭晓答案。阿佑将带你一步步深入了解列表推导式的高级......