这样写就能成为一名合格的pythonic

最近又看了一遍《python从入门到精通》和《利用python进行数据分析》,感觉到一些不一样的地方,特别是pythonic方面,就写写里面提到的一些pythonic操作。

1、代码规范

1.1 编码规则

  • 每个import 语句只导入一个模块
import os 
import sys 
#避免
import sys,os
  • 不要分号,不要用分号将两条命令放在一行
#避免
s = input('输入:');t = input('输出:');
  • 建议每行不超过80个字符,可以使用()将多行内容隐式地连接起来,不推荐使用""。
print('也许你是对的,但是'
	'我不承认')
#输出
Out[1]:也许你是对的,但是我不承认
  • 使用必要的空行可以增加代码的可读性。一般在函数,类,方法定义之间空一行。某些功能分割也可以空一行
  • 运算符两侧、函数参数之间、逗号两侧建议使用空格
  • 避免在循环中使用+和+=。特别是字符串,其不可变,会建立多个临时对象。推荐创建一个列表,最后再join()\
  • 适当使用异常处理结构,禁止过度依赖异常处理结构

1.2 命名规范

命名规范可以更加直观了解代码所代表的的含义。

  • 模块名要短,并且全部都要用小写字母。可以使用下划线分割多个单词。
  • 包名要尽量短,全部小写,推荐使用‘.’而不是下划线
  • 类名采用单词首字母大写(Pascal风格)。例如BorrowBook
  • 函数、类的属性和方法都是小写,多个单词用下划线分割。
  • 常量全部用大写。
  • 单下划线在类中表示受保护的对象
  • 双下划线开头表示私有

2、常用代码技巧

2.1 pass语句提供占位符

pass语句表示空语句,不做任何事情,起到占位作用。这个的作用是,写代码的时候可以使用这个语句先将某个功能占位,之后再实现具体内容。这个好处就是可以在保证程序正常运行的同时,先让程序的各个模块完整。

for i in range(10):
	if i % 2 == 0:
		print(i, end = ' ')
	else:
		pass

这段代码能够正常运行,但是else部分可以先不实现。对于代码的完整性提供了一个很好的占位方式。

2.2 善用推导式

推导式是python的一大特点,对程序员来说也提供了很大的阅读性和便利性。列表、元组、字典、集合都有推导式,按照各自的格式,写for循环是推导式的主要规则。

  • 列表推导式语法如下:
#list = [ Expression for var in range if condition]
#expression是新的列表的值,这个表达式可以用任何计算方法
#var是一个变量,可以在expression中引用
#condition 可以不写,若有则,只有在满足条件时才执行expression
#其实这就是一个for循环,等价于
list = []
for var in range:
	if condition:
		list.append(Expression)
# 例如,生成一个有10个元素的数组,每个元素都是10到100之间的整数随机数
import random
r = [random.randint(10, 100) for i in range(10)]
  • 元组的推导式如下:
#tup = (expression for var in range)
#和列表推导式的差别仅仅是将[]改为()

但是很重要的一点是,元组推导式得到的是一个生成器,是不能直接访问的,必须按照生成器的方式访问,所以在写元组推导式的时候,需要用tuple()显示地将生成器转换为元组。

  • 字典推导式表达式如下:
dic = {key:Expression for var in range}
#key 和expression都可以包含变量var
#最好的实践方式是,结合zip使用
dic = {key: Expression for i, j in zip(key, value)}
  • 集合推导式
    集合和字典的推导式相像,
set = {expression for var in range if condition}
  • 推导式还可以嵌套
[expression for vars in range for var in vars if condition]
#等价于
list = []
for vars in range:
	for var in vars:
		if condition:
			list.append(expression)

因此,当你需要写一个循环得到一个序列的时候,试试推导式。

2.3 python内建的一些序列函数是神器

  • sorted
    列表的实例对象有sort方法,这个方法是改变原列表,而python内置了一个sorted函数,这个函数进行排序不会改变原来的列表,生成一个新的列表。当你需要考虑内存的时候,就要慎用sorted了。
  • enumerate
    当需要遍历一个序列的同时要追踪当前元素的索引
for i, value in enumerate(collection):
#i是索引,value是collection[i]的值
  • zip
    zip将列表、元组或其他序列的元素配对,新建一个元组:
seq1 = ['a', 'b', 'c']
seq2 = [1, 2, 3]
x = zip(seq1, seq2)
x
out[0]
[('a', 1), ('b', 2), ('c', 3)]

神器的是,zip还可以拆分序列

a, b = zip(*x)
a
out[0]
{'a', 'b', 'c'}
b
out[1]
{1, 2, 3}
  • 从序列生成字典
    通常情况下,你会有两个序列想要在字典中按元素配对。
mapping = {}
for key, value in zip(key_list, value_list):
	mapping[key] = value
#由于字典本质上是2-元组的集合,字典是可以接受一个2-元组的列表作为参数的
mapping = dict(zip(key_list, value_list))

2.4 巧用del

del var#可以删除变量,但是实际开发中并不常用,因为python自带的垃圾回收机制会自动销毁不用的元组,所以即使我们不手动将其删除,python会自动回收。
#但是del能够删除列表、元组、字典的某一个元素,还能自动对齐。
x = [1, 2, 3, 4]
x[2]
Out[0]: 3
del x[2]
x[2]
Out[1]: 4

2.5 灵活的assert

在开发过程中,除了使用开发工具自带的调试工具进行调试外,还可以用print函数把错误信息输出查看,但是这种方法会产生很多垃圾信息,调试后还得删掉print。比较麻烦,所有我们推荐使用assert。

assert expression [,reson]
#expression: 条件表达式,如果该表达式的值为真,什么都不做,如果为假,就抛出AssertionError异常。
#reason: 可选参数,用于对判断条件进行描述。
def asser(x, y):
	assert x>y, "x比y小”#当条件不成立时,提示错误信息“x比y小”,即会抛出异常
#一般将assert和异常处理结构结合使用。
try:
	asser(1,2)
except AssertionError as e:
	print("输入有误:“,e)
Out[0]: 输入有误:x比y小
#此时不会抛出异常,因为异常被捕捉了,直接使用print函数输出错误信息

assert语句只在调试阶段有效,可以通过执行python命令是加入-O参数来关闭assert语句。

2.6 jupyter notebook使用的一点小技巧

  • 内省:在一个变量的前后使用’?'可以显示一些关于该对象的概要信息:
In[0] x = [1, 2, 3, 4]
In[1] x?
Out[0]
Type:        list
String form: [1, 3, 4]
Length:      3
Docstring:  
list() -> new empty list
list(iterable) -> new list initialized from iterable's items

如果对象是一个函数或实例方法,且文档已经写好,则文档字符串会显示出来。
使用’??'可以显示函数的源代码

  • 魔术命令
    %run 可以直接运行py文件
    %timeit 可以用来检查一段python语句的执行时间
    %matplotlab inline 可以生成多个绘图窗口,无须干扰控制台的会话。

3、关于函数还有些要说的

3.1 变量的作用域

通常情况下

a = 1
def test():
	a = 2
	print(a)
test()
print(a)
out[0]
2
1

在函数内部改变全局变量是不行的,这只相当于创建了一个临时变量。要达到改变全局变量的作用,必须要使用global关键字声明。

3.2 函数可以返回多个值

函数返回其实本质是一个元组

def f():
	a = 1
	b = 2
	return a, b
a, b = f()

3.3 map函数

map函数能将一个函数应用到一个序列,对每个元素都执行这个函数

map(function, list)

匿名函数

匿名函数通过单个语句生成函数,其结果就是返回值,要使用lambda关键字,格式为:

lambda x: expression
#x是参数,返回值是expression

以上这些东西只是我个人觉得作为pythonic该做的事情。代码简洁美观易读是pythonic都追求的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值