「Python入门」Python代码规范(风格)_python程序通过什么来区分代码块的级别

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


### 5.2 块注释


块注释通常适用于跟随它们的某些(或全部)代码,并缩进到与代码相同的级别。块注释的每一行开头使用一个 # 和一个空格(除非块注释内部缩进文本),块注释内部的段落通常只有一个 # 的空行分隔。



def Fn(param1,parame2):

“”"

描述函数要做的事情

:param parameter1: 参数一描述(类型、用途等)

:param parameter2: 参数二描述

:return: 返回值描述

“”"


### 5.3 文档注释


要为所有的公共模块,函数,类和方法编写文档说明。非公共的方法没有必要,但是应该有一个描述方法具体作用的注释。这个注释应该在def那一行之后。多行文档注释使用的结尾三引号应该是自成一行。



class ClassFn(object):
“”“Summary of class here.
“””

def __init__(self, likes_spam=False):
“”“Inits ClassFn with blah.”“”
self.likes_spam = likes_spam
self.eggs = 0

def public_method(self):
“”“Performs operation blah.”“”



> 
> * Python中使用 # 进行注释,# 号后面要空一格。
> * 最需要写注释的是代码中那些技巧性的部分:对于复杂的操作,应该在其操作开始前写上若干行注释.;对于不是一目了然的代码,应在其行尾添加注释。
> * 为了提高可读性,注释和代码隔开一定的距离,注释应该至少离开代码2个空格,块注释后面最好多留几行空白再写代码。
> * 当代码更改时,优先更新对应的注释。
> * 如果一个注释是一个短语或者句子,它的第一个单词应该大写,除非它是以小写字母开头的标识符(永远不要改变标识符的大小写!)。
> * 如果注释很短,结尾的句号可以省略。块注释一般由完整句子的一个或多个段落组成,并且每句话结束有个句号。
> * 在句尾结束的时候应该使用两个空格。
> 
> 
> 


## 六、 Python空行


顶层函数和类定义,前后用两个空行隔开。编码格式声明、模块导入、常量和全局变量声明、顶级定义和执行代码之间空两行。类里面方法定义用一个空行隔开。在函数或方法内部,可以在必要的地方空一行以增强节奏感,但应避免连续空行。



class Class1:
pass

class Class2:
def fn_1(self):
pass

def fn\_02(self):
    pass

## 七、 Python空格的使用规范


* 在二元运算符两边各空一格,比如赋值(=)、比较(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布尔(and, or, not),算术操作符两边的空格可灵活使用,但两侧务必要保持一致
* 不要在逗号、分号、冒号前面加空格,但应该在它们后面加(除非在行尾)
* 函数的参数列表中,逗号之后要有空格
* 函数的参数列表中,默认值等号两边不要添加空格
* 左括号之后,右括号之前不要加添加空格
* 参数列表, 索引或切片的左括号前不应加空格
* 当’='用于指示关键字参数或默认参数值时,不要在其两侧使用空格



标准范例

spam(ham[1], {eggs: 2}, [])

if x == 4:
print x, y
x, y = y, x

dict[‘key’] = list[index]

def complex(real, imag=0.0): return magic(r=real, i=imag)


## 八、 Python命名规范



模块名命名

模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)

import decoder
import html_parser

变量命名

变量名尽量小写, 如有多个单词,用下划线隔开。

count = 0
this_count = 1

常量或者全局变量命名

全部大写,如有多个单词,用下划线隔开,全⼤写+下划线式驼峰

MAX_COUNT = 99

函数命名

函数名应该小写,如有多个单词,用下划线隔开。 大小写混合仅在为了兼容原来主要以大小写混合风格的情况下使用,保持向后兼容。 私有函数在函数前加一个下划线_。

def run():
pass
def run_with_env():
pass
class Person():
def _private_func():
pass

类命名

类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头。

在接口被文档化并且主要被用于调用的情况下,可以使用函数的命名风格代替。

对于内置的变量命名有一个单独的约定:大部分内置变量是单个单词(或者两个单词连接在一起),首字母大写的命名法只用于异常名或者内部的常量。

class Farm():
pass
class AnimalFarm(Farm):
pass
class _PrivateFarm(Farm):
pass



python1.py 范例代码

def func(a=1):
b = 2
print(locals()) # 打印当前函数(方法)的局部命名空间
‘’’
locs = locals() # 只读,不可写。将报错!
locs[‘c’] = 3
print©
‘’’
return a+b
func()
glos = globals()
glos[‘d’] = 4
print(d)

print(globals()) # 打印当前模块 python1.py的全局命名空间(可写)



> 
> 注:
> 
> 
> * 不要中英文混编
> * 不要有`a、b、c`这种没有意义的命名
> * 不要怕名字长就随便缩写,比如`good_info` 缩写成`gi`
> * 不要用大小写区分变量类型,比如a是`int`类型,A是`String`类型
> * 不要使用容易引起混淆的变量名
> * bool变量⼀般加上前缀 `is_` 如:`is_success`
> * 变量名不要用系统关键字,如 `dir type str`等等
> * 用下画线作前导(`_simple_done`)或结尾(`simple_done_`)的特殊形式是被公认的
> 
> 
> 


## 九、引号用法规则



One(‘hello world?’)
Tow(“my site is vitian.vip”) # 单引号和双引号字符串是相同的。
Three(‘“hell!” vitian.’) # 在同一个文件中,保持使用字符串引号的一致性。在字符串内可以使用另外一种引号,以避免在字符串中使用。


## 十、Python模块导入规则


导入应该放在文件顶部,位于模块注释和文档字符串之后,模块全局变量和常量之前。导入应该按照从最通用到最不通用的顺序分组:标准库导入、第三方库导入、应用程序指定导入,分组之间空一行。尽量保持模块名简单,以无需分开单词最佳(不推荐在两个单词之间使用下划线)。



import os # 模块名称要短,使用小写,并避免使用特殊符号, 比如点和问号。
import numpy # 每个导入应该独占一行。
import sys
from types import StringType, ListType


## 十一、 Main



def main():
… # 主功能应该放在一个main()函数中。

if name == ‘main’: # 代码应该在执行主程序前总是检查 if name == ‘main’, 这样当模块被导入时主程序就不会被执行。
main()


## 十二、Python函数设计规范


* 函数设计的主要目标就是最大化代码重用和最小化代码冗余。精心设计的函数不仅可以提高程序的健壮性,还可以增强可读性、减少维护成本。
* 函数设计要尽量短小,嵌套层次不宜过深。 所谓短小, 就是尽量避免过长函数, 因为这样不需要上下拉动滚动条就能获得整体感观, 而不是来回翻动屏幕去寻找某个变量或者某条逻辑判断等。 函数中需要用到 if、 elif、 while 、 for 等循环语句的地方,尽量不要嵌套过深,最好能控制在3层以内。不然有时候为了弄清楚哪段代码属于内部嵌套, 哪段属于中间层次的嵌套, 哪段属于更外一层的嵌套所花费的时间比读代码细节所用时间更多。
* 尽可能通过参数接受输入,以及通过return产生输出以保证函数的独立性。
* 尽量减少使用全局变量进行函数间通信。
* 不要在函数中直接修改可变类型的参数。
* 函数申明应该做到合理、 简单、 易于使用。 除了函数名能够正确反映其大体功能外, 参数的设计也应该简洁明了, 参数个数不宜太多。 参数太多带来的弊端是: 调用者需要花费更多的时间去理解每个参数的意思,测试的时候测试用例编写的难度也会加大。
* 函数参数设计应该考虑向下兼容。


## 十三、Python版本注记



version = “$Revision: 1.4 $”

$Source: E:/cvsroot/python_doc/pep8.txt,v $ 将 RCS 或 CVS 的杂项包含在你的源文件中

对于 CVS 的服务器工作标记更应该在代码段中明确出它的使用说明,如在文档最开始的版权声明后应加入如下版本标记:

文件: i d id id

版本: R e v i s i o n Revision Revision

这样的标记在提交给配置管理服务器后,会自动适配成为相应的字符串

文件:$Id: ussp.py,v 1.22 2004/07/21 04:47:41 hd Exp $

版本:$Revision: 1.4 $


## 十四、Python模块、包


**模块 module:** 一般情况下,是一个以`.py`为后缀的文件。其他可作为`module`的文件类型还有"`.pyo`"、“`.pyc`”、“`.pyd`”、“`.so`”、“`.dll`”。  
 `module` 可看作一个工具类,可共用或者隐藏代码细节,将相关代码放置在一个`module`以便让代码更好用、易懂,让coder重点放在高层逻辑上。  
 `module`能定义函数、类、变量,也能包含可执行的代码。  
 `module`来源有3种:①Python内置的模块(标准库);②第三方模块;③自定义模块。


当一个文件夹下有 `__init__.py`时,意为该文件夹是一个包(`package`),其下的多个模块(`module`)构成一个整体,而这些模块(`module`)都可通过同一个包(`package`)导入其他代码中。



> 
> `__init__.py`文件用于组织包(`package`),方便管理各个模块之间的引用、控制着包的导入行为。在 `__init__.py`导入我们需要的模块,以便避免逐一导入、方便使用。
> 
> 
> 


## 十五、 sys.modules


`sys.modules` 是一个 将模块名称(`module_name`)映射到已加载的模块(`modules`) 的字典。可用来强制重新加载`modules`。Python一启动,它将被加载在内存中。



import sys
print(sys.modules) # 打印,查看该字典具体内容。


## 十六、 Python相对与绝对导入


### 16.1 绝对导入


所有的模块import都从“根节点”开始。根节点的位置由`sys.path`中的路径决定,项目的根目录一般自动在sys.path中。



import sys,os
BASE_DIR = os.path.dirname(os.path.abspath(file)) # 存放c.py所在的绝对路径

sys.path.append(BASE_DIR)

from B.B1 import b1 # 导入B包中子包B1中的模块b1


### 16.2 Python相对导入


只关心相对自己当前目录的模块位置就好。不能在包(`package`)的内部直接执行(会报错)。不管根节点在哪儿,包内的模块相对位置都是正确的。



b1.py代码

from . import b2 # 这种导入方式会报错。

import b2 # 正确
b2.print_b2()

b2.py代码

def print_b2():
print(‘b2’)

运行b1.py,打印:b2。


## 十七、 Python正则表达式(网络爬虫)


`re 库`是 Python 中处理正则表达式的标准库,本篇博客介绍 re 库的同时,简单介绍一下网络爬虫初阶正则表达式语法。




| 操作符 | 说明 | 例子 |
| --- | --- | --- |
| . | 任何单个字符,极少不能匹配 |  |
| [] | 字符集,对单个字符给出取值范围 | [abc] 表示匹配 a、b、c,[a-z] 表示 a 到 z 单个字符 |
| [^] | 非字符集,对单个字符给出排除范围 | [^abc] 表示匹配 非 a、非 b、非 c 的单个字符 |
| \* | 前一个字符 0 次或无限次扩展 | abc\* 表示 ab、abc、abcc、abccc 等 |
| + | 前一个字符 1 次或无限次扩展 | abc+ 表示 abc、abcc、abccc 等 |
| ? | 前一个字符 0 次或 1 次 | abc? 表示 ab、abc |
| 丨 | 左右表达式任意一个 | abc丨def 表示 abc 或者 def |
| {m} | 扩展前 1 个字符 m 次 | ab{2}c,表示 abbc |
| {m,n} | 扩展前 1 个字符 m 到 n 次 | ab{1,2}c,表示 abc、abbc |
| ^ | 匹配字符串开头 | ^abc 表示 |
| $ | 匹配字符串结尾 | abc$ 表示 |
| () | 分组标记,内部仅能使用操作符 | (abc) 表示 abc,(a |
| \d | 数字,等价于 [0-9] |  |
| \w | 字符,等价于 [A-Za-z0-9] |  |


## 十八、 re 库基本用法


re 库主要函数如下:  
 基础函数:`compile`;  
 功能函数:`search`、`match`、`findall`、`split`、`finditer`、`sub`。



不使用原生字符串的正则表达式 “\\”

使用原生字符串的正则表达式 r"\"

vitian_str=‘D:\python’ # 如果希望字符串中 ’ 可以正常运行,需要加上转移字符 \
print(vitian_str) # => 输出结果:
D:
python

vitian_str= r’D:\python’ # \n 被解析成了换行,如果想要屏蔽这种现象,使用 r
print(vitian_str) # => D:\python

import re
vitian_str=‘你好我是vitian,欢迎来到我的博客’
pattern = r’vitian’

search 范例

ret = re.search(pattern,vitian_str)
if ret:
print(ret.group(0)) # => vitian

print(ret) # => <re.Match object; sapn=(4,10), match=‘vitian’>

re.match 范例

ret = re.match(pattern,vitian_str)
if ret:
print(ret.group(0)) # => vitian

re.match 和 re.search 方法都是一次最多返回一个匹配对象,如果希望返回多个值,可以通过在 pattern 里加括号构造匹配组返回多个字符串。

re.findall 函数范例

该函数用于搜索字符串,以列表格式返回全部匹配到的字符串

ret = re.findall(pattern,vitian_str) # findall 范例
if ret:
print(ret.group(0)) # => vitian

re.split 函数范例

re.split(pattern, string, maxsplit=0, flags=0)

函数进行分割的时候,如果正则表达式匹配到的字符恰好在字符串开头或者结尾,返回分割后的字符串列表首尾都多了空格,需要手动去除

import re
vitian_str=‘你好1我是vitian1,1欢迎来到我的博客1’
pattern = r’\d’
ret = re.split(pattern, vitian_str)
print(ret) # => [‘’,‘你好’,‘我是vitian’,‘,’,‘欢迎来到我的博客’,‘’]

re.finditer 函数

re.finditer(pattern,string,flags=0)

搜索字符串,并返回一个匹配结果的迭代器,每个迭代元素都是 match 对象。

re.sub 函数范例

re.sub(pattern,repl,string,count=0,flags=0) # 在一个字符串中替换被正则表达式匹配到的字符串,返回替换后的字符串 repl 参数是替换匹配字符串的字符串,count 参数是匹配的最大替换次数。

import re
vitian_str=‘你好我是vitian,欢迎来到我的博客’
pattern = r’vitian’
ret = re.sub(pattern, “小王子”, my_str)
print(ret) # => 你好我是小王子,欢迎来到我的博客


## 十九、json标准库总结



> 
> JSON(全名:JavaScript Object Notation 对象表示法)是一种轻量级的文本数据交换格式,JSON的数据格式其实就是python里面的字典格式,里面可以包含方括号括起来的数组,也就是python里面的列表。
> 
> 
> 


### 19.1 JSON是什么


* JSON独立于语言


![img](https://img-blog.csdnimg.cn/img_convert/596d57df97ae692ef25a9495cb7a65ff.png)
![img](https://img-blog.csdnimg.cn/img_convert/01cf8688662d55e305f34ce2b9571bb5.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

交换格式,JSON的数据格式其实就是python里面的字典格式,里面可以包含方括号括起来的数组,也就是python里面的列表。
> 
> 
> 


### 19.1 JSON是什么


* JSON独立于语言


[外链图片转存中...(img-IqN6NXN6-1715344843931)]
[外链图片转存中...(img-RdUKq1WB-1715344843932)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 17
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值