python编码技巧-基础篇
备份一下别人总结的常用技巧
1)注释写法:
错误写法:
##texttexttext
正确写法:
# texttexttext
扩展:
(1)注释有单行注释和多行注释。
(2)单行注释以#开头,空一格,然后输入注释内容。
(3)多行注释用三个单引号 ''' 或者三个双引号 """ 将注释内容括起来。
2)文档字符串写法:
错误写法:
def function():
"say something here!"
pass
def function():
'say something here!'
pass
正确写法:
def function():
"""say something here!
"""
pass
def function():
'''say something here!
'''
pass
扩展:
(1)在函数体的第一行使用一对三个单引号 ''' 或者一对三个双引号 """ 来定义文档字符串。
(2)用于解释文档程序,帮助你的代码更加简单易懂。
(3)可通过function.__doc__方法来获取文档字符串。
3)导入模块格式:
错误格式:
from random import randint
from lib.common.assertUtil import Assert
from lib.base.apiBase import BaseApi
import json
import os
正确格式:
import os
import json
from random import randint
from lib.base.apiBase import BaseApi
from lib.common.assertUtil import Assert
扩展:
(1)直接import的模块写在上面,通过from/import的模块写在下面,中间空一行。
(2)假如import的模块名过长,可以通过as来简化导入的模块名称,如:
from lib.common.assertUtil import Assert as ast
4)function与funciton间的空行:
错误格式:
def function():
pass
def function():
pass
正确格式:
def function():
pass
def function():
pass
扩展:
(1)pycharm可按option+command+L来自动格式对齐。
5)__init__.py文件:
(1)那么如果目录中存在该文件,该目录就会被识别为 module package ,就可以直接进行导入操作,不然会抛出导入失败相关异常。
(2)当用 import 导入该目录时,会执行 __init__.py 里面的代码,所以可以将初始化代码放入该文件中。
2.提高效率的python编码技巧
1)判断方式:
一般方式:
if value=='123':
return True
else:
return False
快捷方式:
if value=='123':
return True
return False
return True if value=='123' else False
扩展:
(1)判断value是否为真或不为空时,可以直接用if value: 来判断;判断为空或为假时,可以直接用if !value:来判断。
value = []
#判断value为空(即长度为0)
if !value:
#判断value不为空(即长度不为0)
if value:
2)遍历方式:
一般方式:
values = [1, 2, 3]
value_list = []
for value in values:
value_list.append(value + 1)
快捷方式:
values = [1, 2, 3]
value_list = [value + 1 for value in values]
扩展:
(1)以上列子可用map()函数来实现(map() 会根据提供的函数对指定序列做映射)。
def add_one(value):
return value + 1
values = [1, 2, 3]
value_list = map(add_one, values)
注意:Python 2.x 返回列表。Python 3.x 返回迭代器。
3)序列化与反序列化:
序列化:
import json
dic = {'1': 1, '2': '2'}
dic_str = json.dumps(dic)
with open('test.json', 'w', encoding='utf-8') as f:
json.dump(dic, f)
反序列化:
import json
dic_str = "{'1': 1, '2': '2'}"
dic = json.loads(dic)
with open('test.json', 'r', encoding='utf-8') as f:
dic = json.load(f)
4)判断内容格式:
judge_str = '123'
judge_int = 123
judge_list = ['1', '2']
judge_dict = {'1': 1, '2': 2}
isinstance(judge_str, str)
isinstance(judge_int, int)
isinstance(judge_list, list)
isinstance(judge_dict, dict)
返回值是boolean型,为真是返回True,为假时返回False。
5)字符串拼接:
obj_str = 'hello' + ' ' + 'world' + str(1)
obj_str = '{0} {1}{2}'.format('hello', 'world', 1)
obj_str = '{first} {second}{third}'.format(first='hello', second='world', third=1)
obj_str = '%s %s%s' % ('hello', 'world', 1)
6)获取文件内容或修改文件内容:
一般方式:
f = open('test.txt', 'r')
print(f.read())
f.close()
f = open('test.txt', 'w')
f.write("hello")
f.close()
快捷方式:
with open('test.txt', 'r') as f:
print(f.read())
with open('test.txt', 'w') as f:
f.write("hello")
扩展:
(1)with...as用法,当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法,所有要求所求值的对象必须有一个__enter__()方法和一个__exit__()方法。
(2)with...as不仅可用在文件读取,也可用在创建进程/线程等等更多场景。
7)方法入参过多或不确定时:
def params(a,b,c,d)
sum = a + b + c + d
def params_args(*args)
sum = 0
for value in args:
sum += value
def params_kwargs(**kwargs):
sum = kwargs.get('a') + kwargs.get('b') + kwargs.get('c') + kwargs.get('d')
def params_args_kwargs(*args, **kwargs):
sum = 0
for value in args:
sum += value
sum += kwargs.get('a') + kwargs.get('b') + kwargs.get('c') + kwargs.get('d')
if __name__ == '__main__':
params(1, 2, 3, 4)
params_args(1, 2, 3, 4)
params_kwargs(a=1, b=2, c=3, d=4)
params_args_kwargs(1, 2, 3, 4, a=1, b=2, c=3, d=4)
扩展:
(1)*args可以传入列表,元组;**kwargs可以传入字典作为参数。
8)字典操作:
一般方式:
obj_dict = {'a': 1, 'b': 2}
#查询
a = obj_dict['a']
a = obj_dict.get('a')
#当执行obj_dict['c']时,查询的key不存在时,程序会抛异常,并且终止程序。
#执行obj_dict.get('c')时,查询的key不存在时,会返回None,程序不会抛异常。
#修改
obj_dict['a'] = 2
obj_dict.update({'a': 2})
#添加
obj_dict['c'] = 3
obj_dict.update({'c': 3})
#删除
obj_dict.pop('a') #返回删除key对应的value
obj_dict.popitem() #删除排序最后一条数据,返回该条数据的key-value元组形式
#获取所有的key
obj_dict.keys()
#获取所有的value
obj_dict.values()
#字典转为列表
list(obj_dict.items())
#遍历字典中的key和value
for key, value in obj_dict.items():
print(key, value)
#合并两个字典
obj_dict_b = {'c': 3}
obj_dict.update(obj_dict_b)
obj_dict_copy = obj_dict.copy()
9)过滤list中的重复值:
一般方式:
obj_list = [1, 2, 3, 4, 4, 3]
obj_list_B = []
for i in obj_list:
if i not in obj_list_B:
obj_list_B.append(i)
快捷方式:
obj_list = [1, 2, 3, 4, 4, 3]
obj_list_B = list(set(obj_list))
扩展:
1)当obj_list中元素为str或int时,才可以使用set()方法。
10)list排序:
正序:
obj_list = [1, 2, 3, 4, 4, 3]
obj_list.sort()
倒序:
obj_list = [1, 2, 3, 4, 4, 3]
obj_list.sort(reverse=True)
排序翻转:
obj_list = [1, 2, 3, 4, 4, 3]
obj_list.reverse()
扩展:
(1)上面的方法都会直接修改obj_list的值,返回值是None,假如不想修改obj_list的值,建议以下方式:
obj_list = [1, 2, 3, 4, 4, 3]
obj_list_B = obj_list.copy()
obj_list_B.sort()
11)路径相关操作:
import os
#当前文件绝对路径
path = os.path.abspath(__file__)
#当前文件所处文件夹目录路径
path = os.path.dirname(os.path.abspath(__file__))
#同级目录下获取别的文件路径
path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.txt')
#判断该路径是否存在
os.path.exists(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test.txt'))
#判断该路径是否是目录
os.path.isdir(os.path.dirname(os.path.abspath(__file__)))