变量命名规则

1. 每一个变量命名时使用一种规则:

b(单个小写字母)
B(单个大写字母)
lowercase
lower_case_with_under_scores
UPPCASE
UPPERCASE_WITH_UNDERSCORES
CaptilizedWorkds (驼峰写法,首字母大写)
mixedCase(驼峰写法,首字母小写)

拒绝:
Capitalized_Words_With_Underscore

2. 尽量统一一种自然语言,除非情况特殊尽可能使用英语:

接受
is_binary = True
 
拒绝
is_er_jin_zhi = True
shi_er_jin_zhi = True

3. 有描述性, 尽可能少用缩写

接受以下命名

price_tag = "$500" #标价500元
num_errors = 100   #100个错误,num是number的缩写,通用
is_connected = True #是否连接

遇到数据结构的时候,可以描述在变量名里

book_list = [book1,book2]
book_tuple = (book1,book2)

#当然也可以使用books = [book1,book2],但是这样看不出来是什么类型,因此book_list更好。

拒绝以下命名

l = 1  I = 1  o = 0
n = 0 # n可以用在很多地方,但没有意义,没有描述性

nerr = 100 #含糊不清的缩写
pc_reader = ... # pc有太多意思
cstmr_id = 0 #原意是customer id,但是删除太多字,最好使用customer_id

connected = True
#connected 可以有很多种理解,如过去连接的东西。is_connected 确定变量类型是boolean

4. 不要使用过长的变量名

20个字符以内, 少于4个单词 拒绝

doYouThinkThisIsAGoodVariableName

5. 不要使用一些常用的函数名作为变量名

拒绝:

int = 10
str = "hello" # str()就没有意义

6. for循环中的情况

接受:

for i in range # i 是index的缩写

避免:

for i in list: # 用具体元素的描述 如 for book in books:
for x in range# x毫无意义

7. 一些程序员之间的命名习惯

普通变量首字母小写,使用lower_case_with_under_scores的写法

dog_name = "Tom"
age = 10

函数名首字母小写,使用lower_case_with_under_scores或mixedCase

def play_game():
    ...
    
def playGame():
    ...

两种都可以接受优先使用第一种
    

class名首字母大写,使用CapCase

class GameController:
    ...

隐藏变量或隐藏函数:如果不想被import的函数,或在class里表示private variable,名字前加下划线_

# 在file 1 里
def _shuffle_card(..):
    ...
    
def replay(...):
    _shuffle_card(..)
  
# 在file 2 里  
    
from file1 import replay # 规定不要import _shuffle_card

常量constant variable使用全大写

BRAND_NAME = "Apple"
COMPANY_LOCATION = "..."

Exception,变量名后面 + Error

class RunTimeError

缩进

1. 使用4 space 缩进

接受

for i in range(10):
    print(i)

拒绝

for i in range(10):
  print(i)

2. tab vs space

  1. 优先使用space
  2. 如果全文都是tab,那就使用tab

3. 括号里的参数换行,参数对齐括号或超过括号

接受

def long_function_name(var_one,var_two,
                        var_three,var_four):       

拒绝

def long_function_name(var_one,var_two,
    var_three,var_four):       

4. 如果括号里的参数从新的一行开始,参数需多加一次缩进

接受

def long_function_name(
        var_one,var_two,
        var_three,var_four):
    print(var_one)
               

拒绝

def long_function_name(
    var_one,var_two,
    var_three,var_four):
    print(var_one)               

5. 如果是if语句,为了视觉上的清晰,可以接受不多加缩进

接受

if (it_is_condition_1 and
    it_is_condition_2):
    do_something()
 
   
    
if (it_is_condition_1 and
    it_is_condition_2):
    # function description 多加一行注释可以更清晰
    do_something()
               

if (it_is_one_thing
        and it_is_another_thing):
    do_something()     

6. list

board = [
        1,2,3,
        4,5,6,
        7,8,9]
        


board = [
    1,2,3,
    4,5,6,
    7,8,9,
]

7. 什么时候需要换行

一行限制72个字,为了能够多窗口打开

关于import

1. 不要连续import不同的包,可以从同一个包中连续import东西

接受:

import sys
import os
from tkinter import Button, Label

拒绝:

import sysos

2. 尽量使用绝对import

提倡

import mymodule.fun1

from mymodule import fun1
from mymodule.fun1 import fun1_1

避免, 但是复杂情况中可以接受

from . import fun1
from .fun1 import fun1_1

3. 避免import *

import * 会引入一系列不必要的内容

代码中的空格

1. 括号后面,前面不要空格

接受:

play_game(game_name)

拒绝:

play_game( game_name )

2.逗号和括号之间不要空格

接受:

num_list = [1,]

拒绝:

num_list = [1, ]

3. 逗号,冒号,分号前不要空格

接受:

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

拒绝:

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

4. 逗号,冒号,分号前不要空格

接受:

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

拒绝:

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

5. 在list里的冒号有以下规则

接受:

book_list[1:9], book_list[1:9:3],book_list[1::9]
book_list[lower:upper]
book_list[lower+offset : upper+offset]
book_list[lower + offset : upper + offset]
book_list[: some_index : some_index

拒绝:

book_list[1: 9], book_list[1:9 :3],book_list[1: :9]
book_list[lower : : upper]
book_list[ : some_index : some_index]

6.函数调用的时候,函数名和括号之间不要空格

接受

my_function()

拒绝

my_function ()

7.作为index的[]前不要有空格

接受

my_list[1]

拒绝

my_list [1]

8.运算符前后不要有超过1个空格

接受

x = 1
y = 2

拒绝

x     =1
y     =1

9.运算符前后最好有一个空格

接受

z = (x + y) * (x - y)
z += 1

拒绝

z=(x+y)*(x-y)
z+=1

10.函数参数里设置默认值的=号前后不要有空格

接受

def my_function(a, b=1):
    ...

拒绝

def my_function(a, b = 1):
    ...

但是如果有参数注释,可以使用空格

def my_function(a, b: AnyStr = ""):
    ...

注释

1. 注释应该是要完整的句子

接受

width += 1 # 增加宽度

拒绝

width += 1 # 加一

2. 注释应该是说明代码在整段代码的作用

接受

width = 20  #设置长方形的初始宽度
num_apples = 20 # 一开始有20个苹果(解释num的意思)

拒绝

width = 20 #宽度为20
num_apples = 20 # 设置变量num_appls为20

3. 介绍参数含义

def my_function(param1,param1, ....):
    """
    这个函数用来...
    
    参数param1: ...
    参数param2: ...
    参数param3: ...
    ...
    
    返回值result:
    """
    do_something(param1, param2)
    ...
    return result
    

调用的时候

my_function(
    param1, #...
    param2, #...
    ....
)

4. 文件内容注释

放文件开头

模块文件:

"""
这个文件为music player的一些必要的函数
例:
    from music_player import play_music, ...
    mixer = ..
    play_music(mixer)
"""

主文件:

"""
项目名:
作者:
时间:

项目介绍:
"""

5. 复杂,或抽象的代码的注释

"""
用户切换play按钮时候改变play的显示内容:
播放的时候显示暂停,暂停的时候显示播放
"""
if music.is_playing:
    play_btn.config(text="pause")
else:
    play_btn.config(text="play")

"""
用户切换play按钮时候改变play的显示内容:
播放的时候显示暂停,暂停的时候显示播放
"""
if music.is_playing:
    #更新歌词,显示,....
    ...
    
else:
    #时间更新停止

6. TODO

如果函数是即将要编写的,或者要分配给队友做,可以注释TODO

def my_function(param):
    #TODO: 函数功能介绍
    pass
    
def your_function(param):
    #TODO: 函数功能介绍
    #Assign: 交给谁做
    pass    
    

7. 其他:

  1. 如果项目很复杂,注释可以让你快速理解代码
  2. 注释要简洁明了
  3. 注释也要让其他人看得懂,因为队友需要阅读你的代码
  4. 注释不要太乱,太乱会看的很累