现在Python是个炙手可热的技能,很多人都想着入手学学Python编程,甚至包括一些知名人士,比如知名地产商潘石屹就开始学Python。关于Python编程的内容在网络上也非常多,本文虫虫给大家总结一些Python编程的常见技巧,以帮助初学者快速入门。

字符串处理技巧

清理用户输入

对输入的的值进行清理处理,是常见的程序要求。比如要做大小写转化、要验证输入字符的注入,通常可以通过写正则用Regex来做专项任务。但是对于复杂的情况,可以用一些技巧,比如下面:

user_input = "Thisstring hassome whitespaces..."

character_map = {

ord('') : ' ',

ord('') : ' ',

ord('') : None

}

在此示例中,可以看到空格字符""和""都被替换为空格,而 ""被删除。

这是一个简单的示例,我们还可以使用unicodedata包和combinin()函数来生成大的映射表,以生成映射来替换字符串。

提示用户输入

命令行工具或脚本需要输入用户名和密码才能操作。要用这个功能,一个很有用的技巧是使用getpass模块:

import getpass

user = getpass.getuser()

password = getpass.getpass()

这三行代码就可以让我们优雅的交互提醒用户输入输入密码并捕获当前的系统用户和输入的密码,而且输入密码时候会自动屏蔽显示,以防止被人窃取。

查找字符串频率

如果需要使用查找类似于某些输入字符串的单词,可以使用difflib来实现:

import difflib

difflib.get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'], n=2)

# 返回['apple', 'ape']

difflib.get_close_matches会查找相似度最匹配的字串。本例中,第一个参数与第二个参数匹配。提供可选参数n,该参数指定要返回的最大匹配数,以及参数cutoff(默认值为0.6)设置为thr确定匹配字符串的分数。

多行字符串

Python中可以使用反斜杠:

In [20]: multistr = " select * from test

...: where id < 5"

In [21]: multistr

Out[21]: ' select * from test where id < 5'

还可以使用三引号

In [23]: multistr ="""select * from test

...: where id < 5"""

In [24]: multistr

Out[24]: 'select * test where id < 5'

上面方法共有的问题是缺少合适的缩进,如果我们尝试缩进会在字符串中插入空格。所以最后的解决方案是将字符串分为多行并且将整个字符串包含在括号中:

In [25]: multistr = ("select * from multi_row "

...: "where row_id < 5 "

...: "order by age")

In [26]: multistr

Out[26]: 'select * from multi_row where row_id < 5 order by age'

处理IP地址

日常常用的一个是验证和匹配IP地址,这个功能有个专门的模块ipaddress可以来处理。比如我们要用IP网段(CIDR用IP和掩码位)生成一个IP地址列表:

import ipaddress

net = ipaddress.ip_network('192.168.1.0/27')

结果:

#192.168.1.0

#192.168.1.1

#192.168.1.2

#192.168.1.3

#...

另一个不错的功能IP地址是否在IP段的验证:

ip = ipaddress.ip_address("192.168.1.2")

ip in net

# True

ip = ipaddress.ip_address("192.168.1. 253")

ip in net

# False

ip地址转字符串、整数值的互转:

>>> str(ipaddress.IPv4Address('192.168.0.1'))

'192.168.0.1'

>>> int(ipaddress.IPv4Address('192.168.0.1'))

3232235521

>>> str(ipaddress.IPv6Address('::1'))

'::1'

>>> int(ipaddress.IPv6Address('::1'))

1

注意ipaddress还支持很多其他的功能,比如支持ipv4和ipv6等,具体可以参考模块的文档。

性能优化技巧

限制CPU和内存使用量

如果Python程序占用资源太大,想限制资源的使用,可以使用resource包。

# CPU限制

def time_exceeded(signo, frame):

print("CPU 超额...")

raise SystemExit(1)

def set_max_runtime(seconds):

soft, hard = resource.getrlimit(resource.RLIMIT_CPU)

resource.setrlimit(resource.RLIMIT_CPU, (seconds, hard))

signal.signal(signal.SIGXCPU, time_exceeded)

# 限制内存使用

def set_max_memory(size):

soft, hard = resource.getrlimit(resource.RLIMIT_AS)

resource.setrlimit(resource.RLIMIT_AS, (size, hard))

对CPU限制时候,先获取特定资源(RLIMIT_CPU)的软限制和硬限制,然后使用参数指定的秒数和获取的硬限制来设置。如果超过CPU时间,将注册导致系统退出的信号。

对内存限制,也先获取软限制和硬限制,并用带有size参数的setrlimit对其进行设置。

通过__slots__节省内存

如果程序中有一个类需要创建大量实例,那么可能会对内存占用会非常大。因为Python使用字典来表示类实例的属性,这可以加速执行,但内存效率很差,通常这不是问题。可以使用__slots__来优化:

import sys

class FileSystem(object):

def __init__(self, files, folders, devices):

self.files = files

self.folders = folders

self.devices = devices

print(sys.getsizeof( FileSystem ))

class FileSystem1(object):

__slots__ = ['files', 'folders', 'devices']

def __init__(self, files, folders, devices):

self.files = files

self.folders = folders

self.devices = devices

print(sys.getsizeof( FileSystem1 ))

# Python 3.5下

#1-> 1016

#2-> 888

当定义__slots__属性时,Python使用固定大小的数组作为属性,而不用字典,这大大减少了每个实例所需的内存。当然使用__slots__也有缺点,比如,无法声明任何新属性,而且只能在_​​_slots__上使用它们,__slots__的类也不能使用多重继承。

用lru_cache缓存函数调用

都说Python性能差,尤其是一些计算的时候,其实是有一些通用的方法可以解决程序能的问题,比如缓存和记忆术。使用functools中的lru_cache可以解决迭代计算中大量重复迭代调用问题:

# CacheInfo(hits=2, misses=4, maxsize=32, currsize=4)

在上例中,我们执行正在缓存的GET请求(最多3个缓存结果)。还使用cache_info方法检查函数的缓存信息。装饰器还提供了clear_cache方法,用于删除缓存。

__all__控制import

某些语言支持import成员(变量,方法,接口)的机制。在Python中,默认所有内容都会import,但是可以使用__all__来限制

def foo():

pass

def bar():

pass

__all__ = ["bar"]

通过这样的方式我们可以限制从some_module import *使用时可以导入的内容。该实例中,则仅import bar函数。如果将__all__保留为空,并且在使用通配符import时,不会import任何东西,会触发AttributeError错误。

面向对象

创建支持With语句的对象

我们都知道如何使用打开或关闭语句,例如打开文件或获取锁,但是如何实现自己的方法呢?

可以使用__enter__和__exit__方法实现:

class Connection:

def __init__(self):

...

def __enter__(self):

# Initialize connection...

def __exit__(self, type, value, traceback):

# Close connection...

with Connection() as c:

# __enter__() executes

...

# conn.__exit__() executes

这是在Python中实现上下文管理的最常见方法,但是有一种更简单的方法:

from contextlib import contextmanager

@contextmanager

def tag(name):

print(f"")

yield

print(f"{name}>")

with tag("h1"):

print("This is Title.")

上面的代码段使用contextmanager管理器装饰器实现了内容管理协议。进入with块时,执行标记函数的第一部分(在yield之前),然后执行该块,最后执行其余的标记函数。

重载运算符号的技巧

考虑到有很多比较运算符:__lt__ , __le__ , __gt__,对于一个类实现所有比较运算符可能会很烦人。这时候可以使用functools.total_ordering:

from functools import total_ordering

@total_ordering

class Number:

def __init__(self, value):

self.value = value

def __lt__(self, other):

return self.value < other.value

def __eq__(self, other):

return self.value == other.value

print(Number(20) > Number(3))

print(Number(1) < Number(5))

print(Number(15) >= Number(15))

print(Number(10) <= Number(2))

该代码使用total_ordering装饰器用于简化为类实现实例排序的过程。只需要定义__lt__和__eq__。

在一个类中定义多个构造函数

函数重载是编程语言中非常常见的功能。即使Python不能重载正常的函数,我们也可以使用类方法重载构造函数:

import datetime

class Date:

def __init__(self, year, month, day):

self.year = year

self.month = month

self.day = day

@classmethod

def today(cls):

t = datetime.datetime.now()

return cls(t.year, t.month, t.day)

d = Date.today()

print(f"{d.day}/{d.month}/{d.year}")

# 14/9/2019

可以不使用构造函数将所有逻辑都放入__init__并使用*args,**kwargs和一堆if语句来解决,但是比较丑陋,没有可读性和可维护性。

获取对象信息

Python提供了几个函数以便我们更好的获取对象的信息,这些函数包括:type、isinstance和dir。

其中type():用于判断对象类型:

>>> type(None)

>>> type(abs)

对类对象type()返回的是对应class类型。下面是判断两个变量的type类型是否相同:

>>> type(11) == type(22)

True

>>> type('abc') == str

True

>>> type('abc') == type(33)

False

isinstance():可以显示对象是否是某种类型

>>> class Husty(Dog):

... pass

...

>>> a = Animal()

>>> b = Dog()

>>> c = Husty()

>>> isinstance(c,Husty)

True

>>> isinstance(c,Dog)

True

>>> isinstance(c,Animal)

True

>>> isinstance(b,Husty)

False

Husty是Husty、Dog、Animal类型的对象,却不能说Dog是Husty的对象。

dir():用于获取一个对象的所有方法和属性。返回值是一个包含字符串的list:

>>> dir('abc')

['__add__', '__class__',…… '__hash__', '__init__', '__i

……'isalnum

'isidentifier', 'islower', …… 'translate', 'upper', 'zfill']

其中,类似__xx__的属性和方法都是有特殊用途的。如果调用len()函数视图获取一个对象的长度,其实在len()函数内部会自动去调用该对象的__len__()方法。

Iterator和切片

如果直接对Iterator切片,则会得到TypeError,指出生成器对象不可下标反问,但是有一个技巧:

import itertools

s = itertools.islice(range(50), 10, 20)

for val in s:

...

使用itertools.islice,可以创建一个islice对象,该对象是生成所需项目的迭代器。但是,这会消耗所有生成器项,直到分片开始为止,而且还会消耗islice对象中的所有项。

跳过一些行

有时,必须使用已知以可变数量的不需要的行(例如注释)。也可以使用itertools:

string_from_file = """

// Author: ...

// License: ...

//

// Date: ...

Actual content...

"""

import itertools

for line in itertools.dropwhile(lambda line: line.startswith("//"), string_from_file.split("")):

print(line)

该代码段仅在初始注释部分之后产生行。如果只想在迭代器的开头丢弃并且不知道其中有多少个项目,则此方法很有用。

命名切片

使用大量硬编码的索引值会很容易引起代码繁琐和破坏代码可读性。常用的技巧是对索引值使用常量,除此之外我们可以使用命名切片:

示例中,可以看到可以索引,方法是先使用slice函数命名它们,然后在切出一部分字符串时使用它们。还可以使用切片对象的属性.start,.stop和.step获得更多信息。

调试技巧

脚本调试

Python的脚本调试可以是使用pdb模块。它可以让我们在脚本中随意设置设置断点::

import pdb

pdb.set_trace()

可以在脚本中任何位置指定pdb.set_trace()并设置断点,非常便捷

在shell中调试程序

在shell中,可以使用python的-i选项就可以启动交互式环境,在该环境下可以打印运行时变量值并调用函数的操作等,比如下面的test.py脚本

def func():

return 0 / 0

func()

在shell中通过python -i test.py运行脚本

我们import pdb然后调用pdb.pm()启动调试器

会显示程序到崩溃的地方,我们退出程序的在该处设置一个断点:

import pdb;

def func():

pdb.set_trace()

return 0 / 0

func()

再次运行它,会在断点处停止,step到下一步

用这样的方法,我们可以调试和回溯程序的执行。通过设置断点,然后在运行程序时,执行将在断点处停止,可以检查程序,例如列出函数参数,对表达式求值,列出变量或step逐步执行等。

有用的小工具

一键web服务共享

在Python中可以使用http.server一键启用一个 HTTP 服务器,这是一个非常方便的共享工具:

python -m http.server

在默认监听端口为 8000 开启一个服务器,可以自定义端口,比如8888

python -m http.server 8888

代码自动补齐Jedi

Jedi是一个用于Python代码自动补齐和静态分析的库。Jedi可以让我们高效的敲代码。

目前Jedi已经提供了绝大多数的编辑器插件,包括Vim(jedi-vim),VSC,Emacs,Sublime,Atom等。

美化异常输出pretty-errors

Python默认的报错输出非常乱,看的人头大,可读性差。这时候就需要用pretty-errors这个错误美化工具了。

结论

本文我们总结了一些Python日常并使用中常见的一些技巧,抛砖引玉以给大家一些帮助和启发。所有这些功能是Python标准库中内容,在日常使用中也建议大家尽量使用python标准库,避免使用第三方库。

python 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址_Python编程常用技巧,你知道几个?...相关推荐

  1. python 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址_产品 | 工信部发声IPv6即将部署,你的路由需要更换吗?...

    提到说话算数不得不表扬一下工信部,从最早的"提速降费"到现在的"携号转网",每一件事情都办的有条不紊,件件落实到咱们老百姓的生活上. 最近两年工信部都在忙一件大 ...

  2. Python -- 定义一个函数,判断输入的数是不是质数

    Python – 定义一个函数,判断输入的数是不是质数 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数,否则称为合数. #定义一个函数,判断该数是不是质数 def sum(n): ...

  3. 【指针编程】 编写一个函数,利用指针在字符串s中的指定位置pos处(这里插入的位置是从1开始,不是下标。)插入字符串。插入的位置和内容是从键盘输入

    [问题描述] 编写一个函数,利用指针在字符串s中的指定位置pos处(这里插入的位置是从1开始,不是下标)插入字符串.插入的位置和内容是从键盘输入 要求:子函数 void InsertStr(char ...

  4. C语言编程>第十一周 ⑤ 请编写一个函数,用来删除字符串中的所有空格。

    例题:请编写一个函数,用来删除字符串中的所有空格. 例如,输入we l come,则输出为welcome. 请勿改动主函数main与其它函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句. ...

  5. 用python编写代码,判断用户输入的字符串是否是回文。

    用python编写代码,判断用户输入的字符串是否是回文. s=input("请输入字符串:") b=int(len(s)) flag=True for i in range(b): ...

  6. python编写一个函数、输入n为偶数时_编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+..-吾爱编程网...

    今天吾爱编程为大家分享一个C语言的经典案例编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n, 当输入n为奇数时,调用函数 1/1+1/3+...+1/n的程序写法,有需要的小伙伴 ...

  7. python编写一个程序、输入一个数判断其是偶数还是奇数_编写一个程序,判断用户输入的整数是偶数还是奇数。 (7.0分)_学小易找答案...

    [其它]已知info=[1,2,3,4,5],请通过两种编程方法,将列表变成info=[5,4,3,2,1] (6.0分) [其它]阅读下面的程序,分析代码是否可以编译通过,如果能编译通过,请列出运行 ...

  8. C语言试题四十一之请编写一个函数,用来删除字符串中的所有空格。

    1. 题目 请编写一个函数function,它的功能是:用来删除字符串中的所有空格. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C程序设计科目.帮助C语言学者打好程 ...

  9. python编写一个函数判断一个数是否为素数是则返回yes_编写函数,判断一个整数是否为素数,并编写主程序调用该函数。_学小易找答案...

    [多选题]下列哪些情形中的外国人可以在中国申请专利? [简答题]为什么应尽量从列表的尾部进行元素的增加与删除操作? [简答题]编写程序,用户输入一个列表和 2 个整数作为下标,然后输出列表中介于 2 ...

最新文章

  1. 题目1049:字符串去特定字符
  2. winform下的未捕捉的异常处理
  3. MFC 自定义消息四步曲与在参数中传递变量
  4. final的8个小细节,听说只有高手才知道!你知道几个?
  5. 在Tomcat 与weblogic 中的 日志(log4j) 配置系列三(log文件的存放路径)
  6. 你用苹果手机多长时间清理一次内存,怎么清理?
  7. linux关机方法有哪些?有何区别_茅台酒都有哪些容量?一升装的与一斤装的到底有何区别?...
  8. android开发练习:天气应用
  9. 51单片机控制电机正反转
  10. python3.7安装pyltp出错_python安装pyltp包
  11. 法向量变换矩阵的推导
  12. oracle混音插件教程,【图片】【教学】waves混音插件官方教学贴,长期更新_混音吧_百度贴吧...
  13. c# 获取本机IP地址
  14. 手机序列号和IMEI号的区别
  15. pandoc输出中文pdf cmd命令记录
  16. 怎样取消Windows 10的虚拟桌面切换动画和窗口动画
  17. python模拟登录163邮箱_Python实现模拟登录网易邮箱的方法示例
  18. 埃默里大学(Emory University)计算机系招收NLP方向博士生啦~
  19. php微信公众号天气预报,微信公众号平台天气预报开发
  20. OpenFlow简单介绍

热门文章

  1. redis面试题(一)赋答案
  2. CentOS7-查看IP
  3. 张一鸣打造“抖音”等现象级产品的秘密:技术深度融合业务,引爆产品创新!
  4. 几种机器学习常用调参方式对比(网格搜索,随机搜索,贝叶斯优化)
  5. 《华为数据之道》-第7章 打造“数字孪生”的数据全量感知能力
  6. Linux-如何查看进程和关闭进程
  7. 数据流图-2(分层数据流图)
  8. Windows环境安装MySQL ZIP Archive
  9. webapi Filter
  10. portalv15安装 tia_安装了TIA Portal V15.1软件,所有程序里有TIAV15.1图标,怎么桌面上没有TIA V15.1的图标?-工业支持中心-西门子中国...