Python小技巧

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Python小技巧

点击上方”python宝典”,关注获取python全套视频,

技术文章第一时间送达!

在这里列举一些我使用Python时积累的小技巧。这些技巧是我在使用Python过程中经常使用的。之前很零碎的记在笔记本中,现在整理出来,和大家分享。

一、import模块

在Python经常使用import声明,以使用其他模块(也就是其它.py文件)中定义的对象。

  1. 使用__name__

当我们编写Python库模块的时候,我们往往运行一些测试语句。当这个程序作为库被import的时候,我们并不需要运行这些测试语句。一种解决方法是在import之前,将模块中的测试语句注释掉。Python有一种更优美的解决方法,就是使用__name__。

下面是一个简单的库程序TestLib.py。当直接运行TestLib.py时,__name__为”main“。如果被import的话,__name__为”TestLib”。


def lib_func(a):
    return a + 10

def lib_func_another(b):
    return b + 20
if __name__ == '__main__':
    test = 101
    print(lib_func(test))
我们在user.py中import上面的TestLib。

import TestLib
print(TestLib.lib_func(120))

你可以尝试不在TestLib.py中使用if name==’main‘, 并对比运行结果。

 

  1. 更多import使用方式

import TestLib as test         # 引用TestLib模块,并将它改名为t

比如:


import TestLib as t
print(t.lib_func(120))

from TestLib import lib_func   # 只引用TestLib中的lib_func对象,并跳过TestLib引用字段

这样的好处是减小所引用模块的内存占用。

比如:


from TestLib import lib_func
print(lib_func(120))

from TestLib import *          # 引用所有TestLib中的对象,并跳过TestLib引用字段

比如:


from TestLib import *
print(lib_func(120))

二、查询

  1. 查询函数的参数

当我们想要知道某个函数会接收哪些参数的时候,可以使用下面方法查询。


import inspect
print(inspect.getargspec(func))
  1. 查询对象的属性

除了使用dir()来查询对象的属性之外,我们可以使用下面内置(built-in)函数来确认一个对象是否具有某个属性:

hasattr(obj, attr_name)   # attr_name是一个字符串

例如:


a = [1,2,3]
print(hasattr(a,'append'))
  1. 查询对象所属的类和类名称

a = [1, 2, 3]
print(a.__class__)
print(a.__class__.__name__)
  1. 查询父类

我们可以用__base__属性来查询某个类的父类:

cls.base

例如:


print(list.__base__)

表示2进制,8进制和16进制数字


print(0b1110)     # 二进制,以0b开头
print(0o10)       # 八进制,以0o开头
print(0x2A)       # 十六进制,以0x开头

三、搜索路径

当我们import的时候,Python会在搜索路径中查找模块(module)。比如上面import TestLib,就要求TestLib.py在搜索路径中。

我们可以通过下面方法来查看搜索路径:


import sys
print(sys.path)

四、字符串拼接

一个最常见的速度陷坑,许多短字串并成长字串时, 大家通常会用:


shortStrs = [ str0, str1, ..., strN]
#N+1个字串所组成的数列
longStr = ""
for s in shortStrs: 
   longStr += s

因为Python 里字串是不可变的, 所以每次 longStr += s 都是将原 来的 longStr 与 str 拷贝成一个新字串, 再赋给longStr. 随着 longStr的不断增长, 所要拷贝的内容越来越长. 最后导至str0被 拷贝N+1次, str1是N次, … .

首先在大家应先学会怎么去找出速度瓶颈: Python 自带有profile模块:


import profile
 profile.run (’想要检查的函数名())

就会打印出那个函数里调用了几次其它函数, 各用了多少时间, 总共用了多少时间等信息,当然脑袋笨一点或是聪明一点的, 也可以用time模块中的time() 来显示系统时间, 减去上次的time()就是与它的间隔秒数了.

字串相并就头上的例子而言, 用 :


longStr="".join(shortStrs)

立马搞定, 但如果shortStrs里面不都是字串, 而包含了些数 字呢 ? 直接用join就会出错. 不怕, 这样来:


shortStrs = [str(s) for s in shortStrs[i]]
longStr ="".join(shortStrs)

也即先将数列中所有内容都转化为字串, 再用join.

对少数几个字串相并, 应避免用:


all = str0 + str1 + str2 + str3 
而用: 
all =%s%s%s%s’ % (str0, str1, str2, str3)

五、循环

比如for循环. 当循环体很简单时, 则循环的调用前头(overhead) 会显得很臃肿, 此时map又可以帮忙了. 比如你想把一个长数列 l=[‘a’, ‘b’, …]中的每个字串变成大写, 可能会用:


import string
 newL = []
 for s in l: 
    newL.append( string.upper(s) )

用map就可以省去for循环的前头:


import string
newL = map (string.upper, l)
Python小技巧

识别图中二维码,欢迎关注python宝典

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Python小技巧


  转载请注明: 好好学java Python小技巧

 上一篇
python面试题(七) python面试题(七)
点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 1 Python中如何使用线程池和进程池? 需要注意一下不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池。其中回调函数非常重要回调函数其实
2021-04-05
下一篇 
这些Python骚操作,你知道吗? 这些Python骚操作,你知道吗?
点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 0x00 世界,你好 程序员第一次接触语言或者框架,基本上都有个 Hello World 的例子,这里 Python 直接将它做成了一个包。 0x01
2021-04-05