面试题之python基础

 

基础语法

 

 

输入和输出

 

  • 代码中要修改不可变的数据会出现什么问题,抛出什么异常?

    代码不会征程运行,抛出TypeError异常java

  • a = 1,b = 2,不用中间变量交换a和b的值?

 

    
 1 # 方法1
 2 a = a + b
 3 b = a - b
 4 a = a -b
 5 
 6 #方法2:
 7  a = a^b
 8 b = b^a
 9 a = a^b
10 
11 #方法3
12 a,b = b, a
View Code

 

  • print调用python中底层的什么方法?

    print方法默认调用sys.stdount.write方法,即往控制台打印字符串python

  • 下面这段代码的输出结果是什么?请解释
class Parent(object):
    x =1
class Child1(Parent):
    pass
class Child2(Parent):
    pass
print(Parent.x, Child1.x, Child2.x)
Child1.x =2
print(Parent.x, Child1.x, Child2.x)
parent.x = 3
print(Parent.x, Child1.x, Child2.x)
View Code
# 结果为 1 1 1 继承父类的类属性,因此都同样,只想同一块内存地址     
# 结果为1 2 1 更改child1,child1的x指向新的内存地址
# 结果为3 2 3 更改parent, parent的x指向新的内存地址

 

  • 简述你对input()函数的理解?

    在python3中, input()获取用户输入,不管用户输入什么,获取到的都是字符串的类型
    在python2中, raw_input()和input(), raw_input()和python3的做用是同样的,input()是输入什么类型,获取到的就是什么数据类型的。mysql

 

条件与循环  

 

  • 阅读下面的代码,写出A0,A1 至An 的最终值
1. A0 = dict(zip(('a''b''c''d''e'),(1,2,3,4,5)))
2. A1 = range(10)
3. A2 = [i for i in A1 if i in A0]
4. A3 = [A0[s] for s in A0]
5. A4 = [i for i in A1 if i in A3]
6. A5 = {i:i*i for i in A1}
7. A6 = [[i,i*i] for i in A1]



#1. A0 = {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
#2. A1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#3. A2 = []
#4. A3 = [1, 3, 2, 5, 4]
#1. A4 = [1, 2, 3, 4, 5]
#2. A5 = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
#3. A6 = [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36],[7, 49],[8, 64] [9,81]]
View Code

 

  • range 和xrange 的区别?

    二者用法相同,不一样的是range 返回的结果是一个列表,而xrange 的结果是一个生成器,前者是
    直接开辟一块内存空间来保存列表,后者是边循环边使用,只有使用时才会开辟内存空间,因此当列表
    很长时,使用xrange 性能要比range 好。linux

 

 

  • 考虑如下Python 代码,若是运行结束,命令行中的运行结果是什么
  
1. l = []
2. for i in xrange(10):
3. l.append({‘num’:i})
4. print l
# 在考虑如下代码,运行结束后的结果是什么?
1. l = []
2. a = {‘num’:0}
3. for i in xrange(10):
4. a[‘num’] = i
5. l.append(a)
6. print



#上方代码的结果:
1. [{‘num’:0},{‘num’:1},{‘num’:2},{‘num’:3},{‘num’:4},{‘num’:5},{‘num’:6},{‘num’:7},{‘num’:8},
{‘num’:9}]
#下方代码结果:
1. [{‘num’:9},{‘num’:9},{‘num’:9},{‘num’:9},{‘num’:9},{‘num’:9},{‘num’:9},{‘num’:9},{‘num’:9},
{‘num’:9}]

#缘由是:字典是可变对象,在下方的l.append(a)的操做中是把字典a 的引用传到列表l 中,当后
续操做修改a[‘num’]的值的时候,l 中的值也会跟着改变,至关于浅拷贝。
View Code

 

文件操做  

  • 4G 内存怎么读取一个5G 的数据?

   方法一:能够经过生成器,分屡次读取,每次读取数量相对少的数据(好比500MB)进行处理,处理结束后在读取后面的500MB 的数据。       
   方法二:能够经过linux 命令split 切割成小文件,而后再对数据进行处理,此方法效率比较高。能够按照行数切割,能够按照文件大小切割。程序员

 

 

  • 如今考虑有一个jsonline 格式的文件file.txt 大小约为10K,以前处理文件的

  代码以下所示:web

1. def get_lines():
2. l = []
3. with open(‘file.txt’,‘rb’) as f:
4. for eachline in f:
5. l.append(eachline)
6. return l
7. if __name__ == ‘__main__’:
8. for e in get_lines():
9. process(e) #处理每一行数据

  如今要处理一个大小为10G 的文件,可是内存只有4G,若是在只修改get_lines 函数而其余代
  码保持不变的状况下,应该如何实现?须要考虑的问题都有哪些?redis

1. def get_lines():
2. l = []
3. with open(‘file.txt’,’rb’) as f:
4. data = f.readlines(60000)
5. l.append(data)
6. yield l

#要考虑到的问题有:
#内存只有4G 没法一次性读入10G 的文件,须要分批读入。分批读入数据要记录每次读入数据#的位
#置。分批每次读入数据的大小,过小就会在读取操做上花费过多时间。
View Code

 

  • read、readline 和readlines 的区别?

    read:读取整个文件。
    readline:读取下一行,使用生成器方法。
    readlines:读取整个文件到一个迭代器以供咱们遍历。算法

 

  • 补充缺失的代码?
1.def print_directory_contents(sPath):
2. """
3. 这个函数接收文件夹的名称做为输入参数
4. 返回该文件夹中文件的路径
5. 以及其包含文件夹中文件的路径
6. """
7. # 补充代码
8. ------------代码以下--------------------
9. import os
10. for sChild in os.listdir(sPath):
11. sChildPath = os.path.join(sPath, sChild)
12. if os.path.isdir(sChildPath):
13. print_directory_contents(sChildPath)
14. else:
15. print(sChildPath)

 

异常

  • 在except 中return 后还会不会执行finally 中的代码?怎么抛出自定义异常?
    #会继续处理finally 中的代码;用raise 方法能够抛出自定义异常
  • 介绍一下except 的做用和用法?

    xcept: #捕获全部异常
    except: <异常名>: #捕获指定异常
    except:<异常名1, 异常名2> : 捕获异常1 或者异常2
    except:<异常名>,<数据>:捕获指定异常及其附加的数据
    except:<异常名1,异常名2>:<数据>:捕获异常名1 或者异常名2,及附加的数据sql

模块与包

  • 经常使用的Python 标准库都有哪些?

    os 操做系统,time 时间,random 随机,pymysql 链接数据库,threading 线程,multiprocessing进程,query队列mongodb

    os 操做系统,time 时间,random 随机,pymysql 链接数据库,threading 线程,multiprocessing
    进程,queue 队列。
    第三方库:
    django 和flask 也是第三方库,requests,virtualenv,selenium,scrapy,xadmin,celery,
    re,hashlib,md5。
    经常使用的科学计算库(如Numpy,Scipy,Pandas)。

     

  • 赋值、浅拷贝和深拷贝的区别?
    1、赋值
    在Python 中,对象的赋值就是简单的对象引用,这点和C++不一样,以下所示:
    16.a = [1,2,"hello",['python', 'C++']]
    17.b = a
    在上述状况下,a 和b 是同样的,他们指向同一片内存,b 不过是a 的别名,是引用。
    咱们可使用b is a 去判断,返回True,代表他们地址相同,内容相同,也可使用id()函数来查
    看两个列表的地址是否相同。
    赋值操做(包括对象做为参数、返回值)不会开辟新的内存空间,它只是复制了对象的引用。也就是
    说除了b 这个名字以外,没有其余的内存开销。修改了a,也就影响了b,同理,修改了b,也就影响
    了a。
    2、浅拷贝(shallow copy)
    浅拷贝会建立新对象,其内容非原对象自己的引用,而是原对象内第一层对象的引用。
    浅拷贝有三种形式:切片操做、工厂函数、copy 模块中的copy 函数。
    好比上述的列表a;
    切片操做:b = a[:] 或者b = [x for x in a];
    工厂函数:b = list(a);
    copy 函数:b = copy.copy(a);
    浅拷贝产生的列表b 再也不是列表a 了,使用is 判断能够发现他们不是同一个对象,使用id 查看,
    他们也不指向同一片内存空间。可是当咱们使用id(x) for x in a 和id(x) for x in b 来查看a 和b 中元
    素的地址时,能够看到两者包含的元素的地址是相同的。
    在这种状况下,列表a 和b 是不一样的对象,修改列表b 理论上不会影响到列表a。
    可是要注意的是,浅拷贝之因此称之为浅拷贝,是它仅仅只拷贝了一层,在列表a 中有一个嵌套的
    list,若是咱们修改了它,状况就不同了。
    好比:a[3].append('java')。查看列表b,会发现列表b 也发生了变化,这是由于,咱们修改了嵌
    套的list,修改外层元素,会修改它的引用,让它们指向别的位置,修改嵌套列表中的元素,列表的地
    址并未发生变化,指向的都是用一个位置。
    3、深拷贝(deep copy)
    深拷贝只有一种形式,copy 模块中的deepcopy()函数。
    深拷贝和浅拷贝对应,深拷贝拷贝了对象的全部元素,包括多层嵌套的元素。所以,它的时间和空
    间开销要高。
    一样的对列表a,若是使用b = copy.deepcopy(a),再修改列表b 将不会影响到列表a,即便嵌
    套的列表具备更深的层次,也不会产生任何影响,由于深拷贝拷贝出来的对象根本就是一个全新的对象,
    再也不与原来的对象有任何的关联。
    4、拷贝的注意点?
    对于非容器类型,如数字、字符,以及其余的“原子”类型,没有拷贝一说,产生的都是原对象的
    引用。
    若是元组变量值包含原子类型对象,即便采用了深拷贝,也只能获得浅拷贝。

     

  • __init__ 和__new__的区别?

    init 在对象建立后,对对象进行初始化。
    new 是在对象建立以前建立一个对象,并将该对象返回给init。

  • Python 里面如何生成随机数?

    在Python 中用于生成随机数的模块是random,在使用前须要import. 以下例子能够酌情列
    举:
    random.random():生成一个0-1 之间的随机浮点数;
    random.uniform(a, b):生成[a,b]之间的浮点数;
    random.randint(a, b):生成[a,b]之间的整数;
    random.randrange(a, b, step):在指定的集合[a,b)中,以step 为基数随机取一个数;

    random.choice(sequence):从特定序列中随机取一个元素,这里的序列能够是字符串,列表,
    元组等。

  • 输入某年某月某日,判断这一天是这一年的第几天?(能够用Python 标准
    库)

    1. import datetime
    2. def dayofyear():
    3. year = input("请输入年份:")
    4. month = input("请输入月份:")
    5. day = input("请输入天:")
    6. date1 = datetime.date(year=int(year),month=int(month),day=int(day))
    7. date2 = datetime.date(year=int(year),month=1,day=1)
    8. return (date1 - date2 + 1).days
    View Code

     

  • 打乱一个排好序的list 对象alist?
    1. import random
    2. random.shuffle(alist)

     

  • 说明一下os.path 和sys.path 分别表明什么?

    os.path 主要是用于对系统路径文件的操做。
    sys.path 主要是对Python 解释器的系统环境参数的操做(动态的改变Python 解释器搜索路径)。

  • Python 中的os 模块常见方法?
    os.remove()删除文件
    os.rename()重命名文件
    os.walk()生成目录树下的全部文件名
    os.chdir()改变目录
    os.mkdir/makedirs 建立目录/多层目录
    os.rmdir/removedirs 删除目录/多层目录
    os.listdir()列出指定目录的文件
    os.getcwd()取得当前工做目录
    os.chmod()改变目录权限
    os.path.basename()去掉目录路径,返回文件名
    os.path.dirname()去掉文件名,返回目录路径
    os.path.join()将分离的各部分组合成一个路径名
    os.path.split()返回(dirname(),basename())元组
    os.path.splitext()(返回filename,extension)元组
    os.path.getatime\ctime\mtime 分别返回最近访问、建立、修改时间
    os.path.getsize()返回文件大小
    os.path.exists()是否存在
    os.path.isabs()是否为绝对路径
    os.path.isdir()是否为目录
    os.path.isfile()是否为文件
    View Code
  • Python 的sys 模块经常使用方法?
    sys.argv 命令行参数List,第一个元素是程序自己路径
    sys.modules.keys() 返回全部已经导入的模块列表
    sys.exc_info() 获取当前正在处理的异常类,exc_type、exc_value、exc_traceback 当前处理的异常详细信息
    sys.exit(n) 退出程序,正常退出时exit(0)
    sys.hexversion 获取Python 解释程序的版本值,16 进制格式如:0x020403F0
    sys.version 获取Python 解释程序的版本信息
    sys.maxint 最大的Int 值
    sys.maxunicode 最大的Unicode 值
    sys.modules 返回系统导入的模块字段,key 是模块名,value 是模块
    sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH 环境变量的值
    sys.platform 返回操做系统平台名称
    sys.stdout 标准输出
    sys.stdin 标准输入
    sys.stderr 错误输出
    sys.exc_clear() 用来清除当前线程所出现的当前的或最近的错误信息
    sys.exec_prefix 返回平台独立的python 文件安装的位置
    sys.byteorder 本地字节规则的指示器,big-endian 平台的值是'big',little-endian 平台的值是'little'
    sys.copyright 记录python 版权相关的东西
    sys.api_version 解释器的C 的API 版本
     sys.version_info 元组则提供一个更简单的方法来使你的程序具有Python 版本要求功能
    View Code
  • unittest 是什么?

    在Python 中,unittest 是Python 中的单元测试框架。它拥有支持共享搭建、自动测试、在测试中暂停代码,将不一样测试迭代成一组的功能

  • 模块和包是什么?

    在Python 中,模块是搭建程序的一种方式。每个Python 代码文件都是一个模块,并能够引用其余的的模块,好比对象和属性
    一个包含许多Python 代码的文件夹是一个包。一个包能够包含模块和子文件夹。

Python 特性

  • Python 是强语言类型仍是弱语言类型?

    Python 是强类型的动态脚本语言。
    强类型:不容许不一样类型相加。
    动态:不使用显示数据类型声明,且肯定一个变量的类型是在第一次给它赋值的时候。
    脚本语言:通常也是解释型语言,运行代码只须要一个解释器,不须要编译。

  • 谈一下什么是解释性语言,什么是编译性语言?

    计算机不能直接理解高级语言,只能直接理解机器语言,因此必需要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。

    解释性语言在运行程序的时候才会进行翻译。
    编译型语言写的程序在执行以前,须要一个专门的编译过程,把程序编译成机器语言(可执行文件

  • Python 中有日志吗?怎么使用?

    Python 自带logging 模块,调用logging.basicConfig()方法,配置须要的日志等级和相应的参数,
    Python 解释器会按照配置的参数生成相应的日志。

  • Python 是如何进行类型转换的?
    内建函数封装了各类转换函数,可使用目标类型关键字强制类型转换,进制之间的转换能够用
    int(‘str’,base=’n’)将特定进制的字符串转换为十进制,再用相应的进制转换函数将十进制转换
    为目标进制。
    可使用内置函数直接转换的有:
    list---->tuple tuple(list)
    tuple---->list list(tuple)
  • Python2 与Python3 的区别?
    1. Python3 对Unicode 字符的原生支持。
    Python2 中使用ASCII 码做为默认编码方式致使string 有两种类型str 和unicode,Python3 只
    支持unicode 的string。
    2. Python3 采用的是绝对路径的方式进行import。
    Python2 中相对路径的import 会致使标准库导入变得困难(想象一下,同一目录下有file.py,如
    何同时导入这个文件和标准库file)。Python3 中这一点将被修改,若是还须要导入同一目录的文件必
    须使用绝对路径,不然只能使用相关导入的方式来进行导入。
    3. Python2 中存在老式类和新式类的区别,Python3 统一采用新式类。新式类声明要求继承object,
    必须用新式类应用多重继承。
    4. Python3 使用更加严格的缩进。Python2 的缩进机制中,1 个tab 和8 个space 是等价的,所
    以在缩进中能够同时容许tab 和space 在代码中共存。这种等价机制会致使部分IDE 使用存在问题。
    Python3 中1 个tab 只能找另一个tab 替代,所以tab 和space 共存会致使报错:TabError:
    inconsistent use of tabs and spaces in indentation.
    2) 废弃类差别
    1. print 语句被Python3 废弃,统一使用print 函数
    2. exec 语句被python3 废弃,统一使用exec 函数
    3. execfile 语句被Python3 废弃,推荐使用exec(open("./filename").read())
    4. 不相等操做符"<>"被Python3 废弃,统一使用"!="
    5. long 整数类型被Python3 废弃,统一使用int
    6. xrange 函数被Python3 废弃,统一使用range,Python3 中range 的机制也进行修改并提升
    了大数据集生成效率
    7. Python3 中这些方法再再也不返回list 对象:dictionary 关联的keys()、values()、items(),zip(),
    map(),filter(),可是能够经过list 强行转换:
    1. mydict={"a":1,"b":2,"c":3}
    2. mydict.keys() #<built-in method keys of dict object at 0x000000000040B4C8>
    3. list(mydict.keys()) #['a', 'c', 'b']
    8. 迭代器iterator 的next()函数被Python3 废弃,统一使用next(iterator)
    9. raw_input 函数被Python3 废弃,统一使用input 函数
    10. 字典变量的has_key 函数被Python 废弃,统一使用in 关键词
    11. file 函数被Python3 废弃,统一使用open 来处理文件,能够经过io.IOBase 检查文件类型
    12. apply 函数被Python3 废弃
    13. 异常StandardError 被Python3 废弃,统一使用Exception
    View Code
    3) 修改类差别
    1. 浮点数除法操做符“/”和“//”的区别
    “ / ”:
    Python2:若为两个整形数进行运算,结果为整形,但若两个数中有一个为浮点数,则结果为
    浮点数;
    Python3:为真除法,运算结果再也不根据参加运算的数的类型。
    “//”:
    Python2:返回小于除法运算结果的最大整数;从类型上讲,与"/"运算符返回类型逻辑一致。
    Python3:和Python2 运算结果同样。
    2. 异常抛出和捕捉机制区别
    Python2
    1. raise IOError, "file error" #抛出异常
    2. except NameError, err: #捕捉异常
    Python3
    1. raise IOError("file error") #抛出异常
    2. except NameError as err: #捕捉异常
    Python2,for 循环会修改外部相同名称变量的值
    1. i = 1
    2. print'comprehension: ', [i for i in range(5)])
    3. print'after: i =', i ) #i=4
    Python3,for 循环不会修改外部相同名称变量的值
    1. i = 1
    2. print'comprehension: ', [i for i in range(5)])
    3. print'after: i =', i ) #i=1
    4. round 函数返回值区别
    Python2,round 函数返回float 类型值
    1. isinstance(round(15.5),int) #True
    Python3,round 函数返回int 类型值
    1. isinstance(round(15.5),float) #True
    5. 比较操做符区别
    Python2 中任意两个对象均可以比较
    1. 11 < 'test' #True
    Python3 中只有同一数据类型的对象能够比较
    1. 11 < 'test' # TypeError: unorderable types: int() < str()
    View Code
    第三方工具包差别
    咱们在pip 官方下载源pypi 搜索Python2.7 和Python3.5 的第三方工具包数能够发现,Python2.7
    版本对应的第三方工具类目数量是28523,Python3.5 版本的数量是12457,这两个版本在第三方工具
    包支持数量差距至关大。
    咱们从数据分析的应用角度列举了常见实用的第三方工具包(以下表),并分析这些工具包在
    Python2.7 和Python3.5 的支持状况:
    分类工具名用途
    数据收集scrapy 网页采集,爬虫
    数据收集scrapy-redis 分布式爬虫
    数据收集selenium web 测试,仿真浏览器
    数据处理beautifulsoup 网页解释库,提供lxml 的支持
    数据处理lxml xml 解释库
    数据处理xlrd excel 文件读取
    数据处理xlwt excel 文件写入
    数据处理xlutils excel 文件简单格式修改
    数据处理pywin32 excel 文件的读取写入及复杂格式定制
    数据处理Python-docx Word 文件的读取写入
    数据分析numpy 基于矩阵的数学计算库
    数据分析pandas 基于表格的统计分析库
    数据分析scipy 科学计算库,支持高阶抽象和复杂模型
    数据分析statsmodels 统计建模和计量经济学工具包
    数据分析scikit-learn 机器学习工具库
    数据分析gensim 天然语言处理工具库
    数据分析jieba 中文分词工具库
    数据存储MySQL-python mysql 的读写接口库
    数据存储mysqlclient mysql 的读写接口库
    数据存储SQLAlchemy 数据库的ORM 封装
    数据存储pymssql sql server 读写接口库
    数据存储redis redis 的读写接口
    数据存储PyMongo mongodb 的读写接口
    数据呈现matplotlib 流行的数据可视化库
    数据呈现seaborn 美观的数据但是湖库,基于matplotlib
    工具辅助jupyter 基于web 的python IDE,经常使用于数据分析
    工具辅助chardet 字符检查工具
    工具辅助ConfigParser 配置文件读写支持
    工具辅助requests HTTP 库,用于网络访问
    View Code
    5) 工具安装问题
    windows 环境
    Python2 没法安装mysqlclient。Python3 没法安装MySQL-python、flup、functools3二、
    Gooey、Pywin3二、webencodings。
    matplotlib 在python3 环境中安装报错:The following required packages can not be
    built:freetype, png。须要手动下载安装源码包安装解决。
    scipy 在Python3 环境中安装报错,numpy.distutils.system_info.NotFoundError,须要本身手
    工下载对应的安装包,依赖numpy,pandas 必须严格根据python 版本、操做系统、64 位与否。运行
    matplotlib 后发现基础包numpy+mkl 安装失败,须要本身下载,国内暂无下载源
    centos 环境下
    Python2 没法安装mysql-python 和mysqlclient 包,报错:EnvironmentError: mysql_config not
    found,解决方案是安装mysql-devel 包解决。使用matplotlib 报错:no module named _tkinter,
    安装Tkinter、tk-devel、tc-devel 解决。
    pywin32 也没法在centos 环境下安装。
    View Code
  • 关于Python 程序的运行方面,有什么手段能提高性能?
    1、使用多进程,充分利用机器的多核性能
    二、对于性能影响较大的部分代码,可使用C 或C++编写
    3、对于IO 阻塞形成的性能影响,可使用IO 多路复用来解决
    4、尽可能使用Python 的内建函数
    五、尽可能使用局部变量
  • Python 中的做用域?

    Python 中,一个变量的做用域老是由在代码中被赋值的地方所决定。当Python 遇到一个变量的话它会按照这的顺序进行搜索:

    本地做用域(Local)--->当前做用域被嵌入的本地做用域(Enclosing locals)--->全局/模块做用域
    (Global)--->内置做用域(Built-in)。

  • 什么是Python?
     Python 是一种编程语言,它有对象、模块、线程、异常处理和自动内存管理,能够加入其余语
    言的对比。
     Python 是一种解释型语言,Python 在代码运行以前不须要解释。
     Python 是动态类型语言,在声明变量时,不须要说明变量的类型。
     Python 适合面向对象的编程,由于它支持经过组合与继承的方式定义类。
     在Python 语言中,函数是第一类对象。
     Python 代码编写快,可是运行速度比编译型语言一般要慢。
     Python 用途普遍,常被用走"胶水语言",可帮助其余语言和组件改善运行情况。
     使用Python,程序员能够专一于算法和数据结构的设计,而不用处理底层的细节。
  • 什么是python自省?
    Python 自省是Python 具备的一种能力,使程序员面向对象的语言所写的程序在运行时,可以得到
    对象的类Python 型。Python 是一种解释型语言,为程序员提供了极大的灵活性和控制力。
  • 什么是Python 的命名空间?
    在Python 中,全部的名字都存在于一个空间中,它们在该空间中存在和被操做——这就是命名空
    间。它就好像一个盒子,每个变量名字都对应装着一个对象。当查询变量的时候,会从该盒子里面寻
    找相应的对象。
  • 你所遵循的代码规范是什么?请举例说明其要求?
    PEP8 规范。
    1. 变量
    常量:大写加下划线USER_CONSTANT。
    私有变量: 小写和一个前导下划线_private_value。
    Python 中不存在私有变量一说,如果遇到须要保护的变量,使用小写和一个前导下划线。但这只是
    程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。但实际上,外部类还
    是能够访问到这个变量。
    内置变量: 小写,两个前导下划线和两个后置下划线__class__
    两个前导下划线会致使变量在解释期间被改名。这是为了不内置变量和其余变量产生冲突。用户
    定义的变量要严格避免这种风格。以避免致使混乱。
    2. 函数和方法
    整体而言应该使用,小写和下划线。但有些比较老的库使用的是混合大小写,即首单词小写,以后
    每一个单词第一个字母大写,其他小写。但如今,小写和下划线已成为规范。
    私有方法:小写和一个前导下划线
    这里和私有变量同样,并非真正的私有访问权限。同时也应该注意通常函数不要使用两个前导下
    划线(当遇到两个前导下划线时,Python 的名称改编特性将发挥做用)。
    特殊方法:小写和两个前导下划线,两个后置下划线
    这种风格只应用于特殊函数,好比操做符重载等。
    函数参数: 小写和下划线,缺省值等号两边无空格
    3. 类
    类老是使用驼峰格式命名,即全部单词首字母大写其他字母小写。类名应该简明,精确,并足以从
    中理解类所完成的工做。常见的一个方法是使用表示其类型或者特性的后缀,例如:
    SQLEngine,MimeTypes 对于基类而言,可使用一个Base 或者Abstract 前缀BaseCookie,
    AbstractGroup
    4. 模块和包
    除特殊模块__init__ 以外,模块名称都使用不带下划线的小写字母。
    如果它们实现一个协议,那么一般使用lib 为后缀,例如:
    import smtplib
    import os
    import sys
    5. 关于参数
    5.1 不要用断言来实现静态类型检测。断言能够用于检查参数,但不该仅仅是进行静态类型检测。
    Python 是动态类型语言,静态类型检测违背了其设计思想。断言应该用于避免函数不被毫无心义的调
    用。
    5.2 不要滥用*args 和**kwargs。*args 和**kwargs 参数可能会破坏函数的健壮性。它们使签
    名变得模糊,并且代码经常开始在不该该的地方构建小的参数解析器。
    6. 其余
    6.1 使用has 或is 前缀命名布尔元素
    is_connect = True
    has_member = False
    6.2 用复数形式命名序列
    members = ['user_1', 'user_2']
    6.3 用显式名称命名字典
    person_address = {'user_1':'10 road WD', 'user_2' : '20 street huafu'}
    6.4 避免通用名称
    诸如list, dict, sequence 或者element 这样的名称应该避免。
    6.5 避免现有名称
    诸如os, sys 这种系统已经存在的名称应该避免。
    7. 一些数字
    一行列数: PEP 8 规定为79 列。根据本身的状况,好比不要超过满屏时编辑器的显示列数。
    一个函数: 不要超过30 行代码, 便可显示在一个屏幕类,能够不使用垂直游标便可看到整个函数。
    一个类: 不要超过200 行代码,不要有超过10 个方法。一个模块不要超过500 行。
    8. 验证脚本
    能够安装一个pep8 脚本用于验证你的代码风格是否符合PEP8。
    View Code
相关文章
相关标签/搜索