【记录】一些很Python的写法

转自公众号【Python那些事儿】

1、变量值交换

不需要用tmp,直接

a,b=b,a

2、列表推导式

for if可直接结合

注意:Python3中 xrange() 改名为range(),要想使用range()获得一个list,必须显式调用: 

    >>> list(range(10)) 

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

numbers = []
for x in range(20):
     if x%3 ==0:
         numbers.append(x*x)

但是如果运用这种方式,一行代码就可以解决:

numbers = [x*x for x in range(20) if x%3==0]

列表 推导式也可以用于集合和字典;将[...]变成{...}即可。

这是集合:

numbers = {x*x for x in range(0,20) if x%3==0}

这是字典:

numbers = {x:x*x for x in range(0,20) if x %3 ==0}

3、字符串拼接

习惯地使用+ 作为连接字符串的方法。

但是由于字符串这种不可变对象在内存中生成之后就无法修改,用 + 合并后的字符串会重新开辟一块内存空间,占用空间,影响效率。

解决的办法是使用字符串连接的join,这样是在原有基础上加的,不重新开辟出一块内存空间。

words = ['I', 'love', 'Python', ',']
sentences = ''.join(words)

见:http://www.cnblogs.com/jsplyy/p/5634640.html


语法:  'sep'.join(seq)

参数说明

sep:分隔符。可以为空

seq:要连接的元素序列、字符串、元组、字典

上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串

返回值:返回一个以分隔符sep连接各个元素后生成的字符串

4、如何快速翻转字符串(利用切片的方式翻转字符串)

Java c++的思路是新建一个字符串,从最后开始访问原字符串:

a = 'I love Python'
reverse_a=''
for i in range(0,len(a)):
     reverse_a +=a[len(a)-i-1]

而Python则将字符串看做list!!!故此列表可使用切片操作来实现反转:

a = 'I love Python'
reverse_a = a[::-1]

5、 for else语句:

c java中,我们寻找一个字符是否在一个list中,通常会设置一个布尔型变量(这里面的变量found就是布尔型变量)表示是否找到:

cities = ['Beijing','shanghai','chengdu']
tofind = 'shanghai'

found = False
for city in cities:
     if tofind == city:
         print('found')
         found = True
         break
if not found:
      print 'not found'
插入:关于if not的用法:

在python中not是逻辑判断词,用于布尔型True和False,not True为False,not False为True,以下是几个常用的not的用法:

(1) not与逻辑判断句if连用,代表not后面的表达式为False的时候,执行冒号后面的语句。比如:

a = False

if not a:   (这里因为a是False,所以not a就是True)

    print "hello"

这里就能够输出结果hello

(2) 判断元素是否在列表或者字典中,if a not in b,a是元素,b是列表或字典,这句话的意思是如果a不在列表b中,那么就执行冒号后面的语句,比如:

a = 5

b = [1, 2, 3]

if a not in b:

    print "hello"

这里也能够输出结果hello



Python中的通过for...else... 会使代码很简洁,注意else中的代码块仅仅是在for循环中没有执行break 语句的时候执行:

cities = ['Beijing','shanghai','chengdu']
tofind = 'shanghai'
for city in cities:
     if tofind == city:
         print('found')
         break
else:
#执行else中的语句意味着没有执行break
      print('no found')


另外,while try 关键字都可以和else搭配使用。


6、关于else

在其他程序语言中,else似乎只是与if 关键字有缘分,而不能与其他关键字搭配使用。

在Python中,else还可以与 for while try等关键字匹配使用。

for:

只有当for 循环运行完毕时,也就是说在for 循环中没有关键字break来终止循环,else中的运行块才能够运行。(使用的是for else代码块的话,是需要将for 和 else对齐的)。   即:满足条件break跳出就不执行else代码块,不满足条件未执行break语句就会相应的执行else语句。而在其他语言中往往还需要设置一个布尔型变量作为标识来判断循环有没有执行完。

while:

只有当while运行完毕,也就是说while的循环条件为假而退出,没有关键字break来终止循环while循环,else中的代码块才能运行。这一点与for循环里面的else用法类似。

find = 'java'
array = ['I','love','Python','forever']

i =0
while i<len(array):
        if find == array[i]:
           print 'Found'
           break
         i+=1
else:
         print('Not found')

try:

只有当try 块中的代码没有补货到任何一种异常时,才执行else块中的代码。

try:
    <code1>
except <name>:
     <code2>
else:
     <code3>

当code1 代码执行过程中捕获到任何一种异常时,就会执行code2代码块,如果没有任何异常,会执行code3代码块。  

注意是没有任何异常,如果存在异常而except 模块没捕获到,那么else代码块中的代码不会执行。下例是关于读取文件的一个应用:

filename = 'Python.txt'

try:
    file = open(filename,"r")
except Exception as error:
    print("file open error")
else:
    for line in file:
          print line
    file.close()

7、迭代对象善用enumerate类

enumerate类接收两个参数,其中一个是可以迭代的对象。另外一个是开始的索引。下例实现了打印一个列表的索引及其内容。

cities = ['Beijing', 'Tianjin','Shanghai']

index = 0
for city in cities:
     index = index +1
     print index,':',city

通过enumerate极大简化代码(enumerate的方便之处就是记录索引和值),索引设置为从1开始(默认是从0开始,这里指定是从1开始):

cities = ['Beijing', 'Tianjin','Shanghai']
for  index,city in enumerate(cities,1):
      print index,":"city

8、lambda定义函数:

def f(x):
      return x*x
等价于
lambda x:x*x
map经常和lambda搭配使用,前面是函数,后面是待处理的序列

map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

map(lambda x:x*x,[1,2,4,5])

9、with 语句

下例是操作文件读取的常见示例:

with open('Python.txt') as f:
       for line in f:
            print line

根据文件名打开一个文件,如果没有异常抛出,就把文件对象赋值给f,然后用迭代器遍历文件的每一行,当完成时,关闭文件;若在中途发生异常,仍会关闭文件。

with是通过上下文对象来完成处理的,with语句的通用结构如下:

with context_expr as var:
       with_suite

context_expr为一上下文表达式,执行此表达式会返回一个上下文管理器。上下文管理器的职责是提供一个上下文对象,这是通过调用_context_()方法来完成的,这个方法返回上下文对象。上下文管理器本身也可以是上下文对象,即调用_context_方法返回其本身。

__enter__() 方法将完成 with 语句块执行前的所有准备工作,如果 with 语句后面跟了 as var 语句,则 var 即为 __enter__() 方法的返回值。

__exit__() 方法将完成 with 语句块执行后的所有处理工作,__exit__() 方法有3个参数,如果 with 语句正常结束,三个参数全部都是 None;如果发生异常,三个参数的值分别等于调用 sys.exc_info() 函数返回的三个值:类型(异常类)、值(异常实例)和跟踪记录(traceback),相应的跟踪记录对象。

with 语句很常用的功能,就是在执行语句块前申请获取相关的资源,而在 with 语句块执行完成之后,需要释放相关资源。

见:http://mp.weixin.qq.com/s?__biz=MzAwOTQ4MzY1Nw==&mid=2247484007&idx=1&sn=295faf774df1b28ef191333b86b046a8&chksm=9b5fa681ac282f9709d5f8b88eb7a6ccdfe114fa43488efda9edd8583a206532ca174db3e2d5&mpshare=1&scene=1&srcid=0908uCFBchEl44JgnuzoDtBy#rd

这个里面没有 try......except......finally...... 的代码块。 try......except......finally......是这样子写的:

try:
    file = open('python.txt')
    for line in file:
         print line
except:
     print("File error")
finally:
     file.close()

10、使用装饰器

装饰器基本是在具体函数执行之前或之后做相关的操作,比如: 执行前打印执行函数的相关信息,对函数的参数进行校验;执行后记录函数调用的相关流水日志等。使用装饰器最大的好处是:使得函数功能单一化,仅仅处理业务逻辑,而不附带其他功能。













  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值