自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(74)
  • 收藏
  • 关注

原创 4.6带有外部状态的生成器函数

问题:​ 你想定义一个生成器函数,但是它会调用某个你想暴露给用户使用的外部状态值。解决方案:​ 如果 你想让你的生成器暴露外部状态给用户,别忘了你可以简单的将它实现为一个类,然后把生成器函数放到__iter__()方法中过去。比如:from collections import dequeclass linehistory: def __init__(self,lines,histlen=3): self.lines=lines self.history

2022-03-26 12:02:28 183

原创 4.3使用生成器创建新的迭代模式

​ 问题:​ 你想实现一个自定义迭代模式,跟普通的内置函数比如range(),reverse的()不一样。解决方案:​ 如果你想实现一种新的迭代模式,使用一个生成函数来定义它。下面是 一个生产某个范围内浮点数的生成器。def frange(start, stop, increment): x = start while x < stop: yield x x += incrementfor n in frange(1, 10, 3)

2022-03-17 11:36:28 438

原创 4.2代理迭代

问题:​ 你构建了一个自定义容器对象,里面包含有列表、元组或其他可迭代对象。你想直接在你的这个新容器对象上执行迭代操作。解决方案:​ 实际上你只需要定义一个__iter__()方法,将迭代操作代理到容器内部的对象上去,比如:class Node: def __init__(self,value): self._value=value self._children=[] def __repr__(self): return 'Node

2022-03-17 11:11:28 202

原创 4.1手动遍历迭代器

问题:​ 你想遍历一个可迭代对象中的所有元素,但是却不想使用for循环解决方案:​ 为了手动的遍历可迭代对象,使用next()函数并在代码中捕获StopIterable异常。比如,下面的例子手动读取一个文件中的所有行:def manual_iter(): with open(r'D:\study\workspace\python学习\python3高级\第二章:字符串和文本\2-1使用多个界定符分隔字符串.py') as f: try: while

2022-03-16 17:44:18 269

原创 3.16结合时区的日期操作

问题:解决方案:​ 对几乎所有涉及到时区的问题,你都应该使用pytz模块,这个包提供了Olson时区数据库,它是时区的事实上的标准,在很多语言和操作系统里面都可以找到,pytz模块一个主要用途是将datetime库创建的简单日期对象本地化,比如,下面如果表示一个芝加哥时间的示例:from datetime import datetimefrom pytz import timezoned = datetime(2022, 12, 21, 9, 12, 0)print(d) # ->

2022-03-16 09:27:46 157

原创 3.15字符串转换为日期

问题:​ 你的应用程序接受字符串格式的输入,但是你想将它们转换为datetime对象以便在上面执行非字符串操作。解决方案:​ 使用python的标准模块datetime可以很容易解决这个问题,比如:from datetime import datetimetext='2022-03-15'y=datetime.strptime(text,'%Y-%m-%d')z=datetime.now()diff=z-yprint(diff)# ->15:38:26.477008讨论:

2022-03-15 16:18:05 2119

原创 3.14计算当前月份的日期范围

问题:​ 你的代码需要在当前月份中循环每一天,想要找到一个计算这个日期范围的高效方法。解决方案:​ 在这样的日期上循环并需要事先沟通构造又给包含所有日期的列表,你可以先计算出开始日期和结束日期,然后在你步进的时候使用datetime.timedelta对象递增这个日期变量即可。​ 下面是一个接受任意datetime对象并返回一个由当前月份开始和下个月开始日组成的元素对象。from datetime import datetime, date, timedeltaimport calendar

2022-03-15 15:22:56 227

原创 3.13计算最后一个周五的日期

问题:​ 你需要查找星期中某一天最后出现的日期,比如星期五。解决方案:​ Python的datetime模块中有工具函数和类可以帮助你执行这样的计算。下面是对类似这样的问题的一个通用解决方案:from datetime import datetime, timedeltaweekdays = [ 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Su

2022-03-15 10:06:59 1076

原创 3.12基本的日期与时间转换

问题:​ 你需要执行简单的时间转换,比如天到秒,小时到分钟等的转换。解决方案:​ 为了执行不同时间单位的转换和计算,请使用datatime模块,比如,为了表示一个时间段,可以创建一个timedatela实例,就像下面这样:from datetime import timedeltaa=timedelta(days=2,hours=6)b=timedelta(hours=4.5)c=a+bprint(c.days)# ->2print(c.seconds) # ->3780

2022-03-11 17:49:49 454

原创 3.11随机选择

问题:​ 你想从一个序列中随机抽取若干元素,或者想生成几个随机数。解决方案:​ random模块有大量的函数用来生产随机数和随机选择元素。比如,想要从一个序列中随机的抽取一个元素,可以使用random.choice():import randomvalues=[1,2,3,4,5,6]print(random.choices(values))为了提取N个不同元素的样本用来做进一步的操作,可以使用random.sample():print(random.sample(values,2))

2022-03-11 17:19:52 310

原创 3.10矩阵与线性代数运算

问题:​ 你需要执行矩阵和线性代数运算,比如矩阵乘法、寻找行列式、求解线性方程组等等。解决方案:​ Numpy库有一个矩阵对象可以用来解决这个问题。​ 矩阵类似于3.9小节中数组对象,但是遵循线性代数的计算规则。下面的一个例子展示了矩阵的一些基本特性:import numpy as npm = np.matrix([[1, -2, 3], [0, 4, 5], [7, 8, -9]])print(m)'''[[ 1 -2 3] [ 0 4 5] [ 7 8 -9]]

2022-03-11 17:03:06 2195

原创 3.9大型数组运算

问题:​ 你需要在数据集(比如数组或网格)上面执行计算:解决方案:​ 涉及到数组的重量级运算操作,可以使用NumPy库。NumPy的一个主要特征是它会给Python提供一个数组对象,相比标准的Python列表已更适合用来做数学运算。下面是一个简单的小例子,向你展示标准列表对象和NumPy数组之间的差别:x = [1, 2, 3, 4]y = [5, 6, 7, 8]print(x * 2) #->[1, 2, 3, 4, 1, 2, 3, 4]# print(x + 10)pri

2022-03-10 09:51:56 275

原创 3.8分数运算

问题​ 你进入时间机器,突然发现你正在做小学家庭作业,设计到分数计算问题。或者你可能需要写代码去计算你的木工工厂中的测量值。解决方案:​ fraction模块可以被用来执行包含分数的数学运算。比如:from fractions import Fractiona=Fraction(5,4)b=Fraction(7,16)print(a+b) # ->27/16print(a*b) # ->35/64c=a*bprint(c.numerator) # ->35p

2022-03-07 11:07:53 148

原创 3.7无穷大于NaN

问题​ 你想创建或测试正无穷、负无穷或NaN(非数字)的浮点数。解决方案​ Python并没有特殊的语法来表示这些特殊的浮点值,但是可以使用float()来创建它们。比如:a = float('inf')b = format('-inf')c = float('nan')print(a) # ->infprint(b) # ->-infprint(c) # ->nan​ 为了测试这些值的存在,使用math.isif()和math.isnan()函数。比如:

2022-03-05 21:46:19 373

原创 3.6复数的数学运算

问题​ 你写的最新的网络认证方案代码遇到了一个难题,并且你唯一的解决办法就是使用复数空间。再或者你仅仅需要使用复数执行一些计算操作。解决方案​ 复数可以使用函数complex(real,imag)或者是带有后缀j的浮点数来指定。比如:a=complex(2,4)b=3-5jprint(a) # ->(2+4j)print(b)# ->(3-5j)​ 对应的实部、虚部和共轭复数可以很容易的获取。就像下面这样:print(a.real)# ->2.0print(a.

2022-03-05 21:28:16 337

原创 3.5字节到大整数的打包与解包

3.5字节到大整数的打包与解包问题​ 你有一个字节字符串并想它解压成一个整数。或者,急需要将又给大整数转换为一个字节字符串。解决方案​ 假设你的程序需要处理又给拥有128位长的16个元素的字节字符串。比如:data=b'\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004'print(len(data)) # ->16print(int.from_bytes(data,'little')) # ->69120565665751139

2022-03-05 13:54:41 93

原创 3.3数字的格式化输出

问题​ 你需要将数字格式化输出,并控制数字的位数、对齐、千位分隔符合其他的细节。解决方案​ 格式化输出单个数字的时候,可以使用内置的format()函数,比如:x=1234.56789print(format(x,'0.2f'))print(format(x,'>10.1f'))print(format(x,'<10.1f'))print(format(x,'^10.1f'))print(format(x,','))print(format(x,'0,.1f'))'''

2022-03-05 13:34:08 316

原创 3.4二八十六进制整数

问题​ 你需要转换或者输出使用二进制,八进制或者十六进制表示的整数。解决方案​ 为了将整数转换为二进制、八进制或十六进制的文本串,可以分别使用bin(),oct()或hex()函数:x=1234print(bin(x)) # ->0b10011010010print(oct(x)) # ->0o2322print(hex(x)) # ->0x4d2​ 另外,如果你不想输出0b,0o或者0x的前缀的话,可以使用format()函数。比如:print(forma

2022-03-05 13:30:54 148

原创 3.2执行精确的浮点数运算

问题​ 你需要对浮点数执行精确的计算操作,并且不希望有任何小误差的出现。解决方案​ 浮点数的一个普遍问题是它们并不能精确的表示十进制数。并且,即使是最简单的数学运算也会产生小的误差,比如:a = 2.1b = 4.2c = a + bprint(c) # ->6.300000000000001print(round(c, 2)) # ->6.3这些错误是底层CPU和IEEE754标准通过自己的浮点单位去执行算术时的特征。由于Python的浮点数据类型使用底层表示存储数

2022-03-04 22:18:48 195

原创 3.1数字的四舍五入

问题​ 你想对浮点数执行指定精度的舍入运算。解决方案​ 对于简单的舍入运算,使用内置的round(value,ndigits)函数即可。比如:print(round(1.23, 1)) # ->1.2print(round(1.27, 1)) # ->1.3print(round(-1.27, 1)) # ->-1.3print(round(1.25361, 3)) # ->1.254​ 当一个值刚好在两个边界的中间的时候,round函数返回离它最近的

2022-03-04 21:54:18 463

原创 2.17在字符串中处理html和xml

问题​ 你想将HTML或者XML实体如&entity;或&#code;替换为对应的文本。再者,你需要转换文本特定的字符(比如<,>或者&)。解决方案​ 如果你想替换文本字符串中的’<‘或者’>’,使用html.escape()函数可以很容易的完成。比如:s='The report said the human rights situation in the"<tag> text</tag>"'import htmlpri

2022-03-04 12:10:57 123

原创 2.15字符串中插入变量

变量​ 你想创建一个内嵌变量的字符串,变量被它的值所表示的字符串替换掉。解决方案​ Python并没有在字符串中简单替换变量值提供直接的支持,但是通过使用字符的format()方法来解决这个问题,比如:s='{name} has {n} message'print(s.format(name='XingXing',n=35)) # ->XingXing has 35 message​ 或者,如果要被替换的变量能在变量域中找到,那么你可以结合使用format_map()和vars

2022-02-28 17:33:29 1668

原创 2.14合并拼接字符串

问题​ 你想将几个小的字符串合并为一个大的字符串解决方案​ 如果你想合并的字符串是一个序列或者iterable中,那么最快的方式就是使用join()方法,比如parts=['Is','Chicago','Not','Chicago?']print(' '.join(parts)) # ->Is Chicago Not Chicago?print(','.join(parts)) # ->Is,Chicago,Not,Chicago?print(''.join(parts))

2022-02-28 16:32:09 142

原创 2.13字符串对齐

问题​ 你想通过某种对齐方式来格式化字符串解决方案​ 对于基本的字符串对齐操作,可以使用字符串ljust(),rjsut()和center()方法。比如:text='Hello World'print(text.ljust(20))print(text.rjust(20))print(text.center(20))'''Hello World Hello World Hello World '''​ 所有这些方法都能接受一

2022-02-28 16:00:12 170

原创 2.12 审查清理文本字符串

问题​ 一些无聊的幼稚黑客在你的网站页面的表单中输入文本你’pÃthöñ’,然后你想将这些字符清理掉。解决方案​ 文本清理问题会涉及到包含文本解析与数据处理等一系列问题。在非常简单的情形下,你可能会选择使用字符串函数(比如str.upper()和str.lower())将文本转为标准格式。使用str.replace()或者re.sub()的简单替换操作能删除或者改变指定的字符序列。你同样还可以使用unicodedata.normalize()函数将unicode文本标准化.​ 然后,有时候你可

2022-02-28 15:04:12 254

原创 2.11删除字符串中不需要的字符

问题​ 你想去掉文本字符串开头,结尾或者中间不想要的字符,比如空白。解决方案​ lstrip()方法能用于删除开始或者结尾的字符。lstrip()和 rstrip()分别从左或者右执行删除操作。默认情况下,这些方法会去掉空白字符,但是你也可以指定其他字符。s=' hello world \n'print(s.strip()) # ->hello worldprint(s.lstrip()) # -> hello world \nprint(s.strip()) #-&g.

2022-02-28 14:00:53 615

原创 2.10 在正则中使用Unicode

​ 问题​ 你正在使用正则表达式处理文本,但是关注的是Unicode字符处理。解决方案​ 默认情况下re已经对一些Unicode字符类有了基本的支持,比如,\\d已经匹配任意的unicode数字字符了:import renum=re.compile('\d+')print(num.match('123')) # -><re.Match object; span=(0, 3), match='123'>print(num.match('\u0661\u0662\u0663

2022-02-28 14:00:15 309

原创 2.9Unicode 文本标准化

问题​ 你正在处理Unicode字符串,需要确保所有字符串在底层有相同的表示。解决方案​ 在Unicode中,某些字符能够用多个合法的编码表示。为了说明,考虑下面的这个列子:s1='Spicy Jalape\u00f1o's2='Spicy Jalapen\u0303o'print(s1) # ->Spicy Jalapeñoprint(s2) # ->Spicy Jalapeñoprint(len(s1)) # ->14print(len(s2)) #

2022-02-24 10:16:30 260

原创 2.8多行匹配

问题​ 你正在试着用正则表达式去匹配一大块的文本,而你需要跨越多行去匹配。解决方案​ 这个问题很典型的小淮娘在当你用点(.)去匹配任意字符的时候,忘记了点(.) 不能匹配换行符的事实。比如假设你想试着匹配C语言分割的注释:import recomment = re.compile(r'/\*(.*?)\*/')text1 = '/* this is a comment */'text2 = '''/* this is a 'comment */ '''print(

2022-02-24 10:15:51 424

原创 2.7最短匹配模式

问题​ 正则表达式匹配某个文件模式,但是它是找到的模式最长可能匹配。而你想修改它变成查找最短的可能匹配。解决方案​ 这个问题一般出现在需要匹配一对分隔符之间的文本的时候(比如引号包含的字符串)。为了说明清楚,考虑如下的例子:import restr_pat = re.compile(r'\"(.*)\"')text1 = 'Computer says "no."'print(str_pat.findall(text1)) # ->['no.']text2='Computer s

2022-02-24 10:13:32 85

原创 2.6字符串忽略大小写的方式搜索与替换文本字符串

问题​ 你需要以忽略大小写的方式搜索与替换文本字符串解决方案​ 为了在文本操作时忽略大小写,你需要在使用re模块的时候给这些操作提供re.IGNIRECASE标志参数。比如:import retext = 'UPPER PYTHON, lower python, Mixed Python'print(re.findall('python',text,flags=re.IGNORECASE)) # ->['PYTHON', 'python', 'Python']print(re.s

2022-02-24 10:03:10 419

原创 2.5字符串搜索替换

问题​ 你想在字符串中搜索和匹配指定的文件模式解决方案​ 对于简单的字面模式,直接使用str.replace()方法即可,比如:text = 'yeah,but no, but yeah, but no ,but yeah'print(text.replace('yeah','yep')) # ->yep,but no, but yep, but no ,but yep​ 对于复杂的模式,请使用re模块中的sub()函数。为了说明这个,假设你想将形式为02/18/2012的日志

2022-02-24 10:02:36 147

原创 2.4字符串匹配和搜索

问题​ 你想匹配或者搜索特定模式的文本解决方案​ 如果你想匹配的是字符串,那么你通常只需要调用基本字符串方法就行,比如str.find(),str.endswith(),str.startswith()或者类似的方法:text = 'yeah,but no, but yeah, but no ,but yeah'print(text == 'yeah')print(text.startswith('yeah')) # ->Trueprint(text.endswith('no')

2022-02-24 10:01:26 501

原创 2.3用Shell通配符匹配字符串

问题​ 你想使用Unix Shell中常用的通配符(比如*.py,Date[0-9]*.csv等)去匹配文本支付串解决方案​ fnamtch模块提供了两个模块函数–fnamtch()和fnmatchcase(),可以用来实现这样的匹配。from fnmatch import fnmatch,fnmatchcaseprint(fnmatch('foo.txt','*.txt')) # ->Trueprint(fnmatch('foo.txt','?oo.txt'))# ->T

2022-02-24 09:58:50 1211

原创 2.2字符串开头或者结尾匹配

问题​ 你需要通过指定的文本模式去检查字符串的开头或者结尾,比如文件名后缀,URL Scheme等等。解决方案​ 检查字符串开头或结尾的一个简单方法是使用str.startswith()或者是str.endswith()方法。比如:filename='spam.txt'print(filename.endswith('.txt')) #->Trueprint(filename.startswith('file:')) #->Falseurl='https://www.baid

2022-02-24 09:58:13 565

原创 2.1使用多个界定符分隔字符串

问题​ 你需要将一个字符串分割为多个字段,但是分隔符(还有周围的空格)并不是固定的。解决方案​ string对象的split()方法只适用于非常简单的字符串分割情形,它并不允许有多个分隔符或者是分隔符周围不确定的的空格。当你需要添加更灵活的切割字符串的时候,最好使用re.split()方法:import reline = 'asdf fjdk; afed, fjek,asdf, foo'res = re.split(r'[;,\s]\s*', line)print(res) # -&

2022-02-24 09:57:57 255

原创 1.20合并多个字典或者映射

问题​ 现在很多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作。比如查找值或检查某些键是否存在。解决方案​ 假如你有如下两个字典:a={'x':1,'z':3}b={'y':2,'z':4}​ 现在假设你必须在两个字典中执行查找元素操作(比如先a中找,如果找不到再b中找)。一个非常简单的解决方案就是使用collection模块中的ChainMap类。比如:from collections import ChainMapc = ChainMap(a, b)pr

2022-02-24 09:31:45 112

原创 1.19转换并计时数据

问题​ 你需要在数据列上执行聚集函数(比如sum(),min(),max(),但是首选你需要转换或者过滤数据解决方案​ 一个非常优雅的方式去结合数据计算与转换就是使用一个生成器表达式参数。比如,如果你想计算平方和,可以像下面这样做:nums=[1,2,3,4,5]s=sum(x*x for x in nums)print(s)下面有跟多的列子:import osfiles = os.listdir('D:\study\workspace\python学习')if any(name

2022-02-23 15:44:18 79

原创 1.1解压序列复制给多个变量

1.1解压序列复制给多个变量问题:​ 现在有一个包含N个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给N个变量?解决方案:​ 任何的序列(或者是可迭代对象)可以通过一个简单的赋值语句解压并赋值给多个变量。唯一的前提就是变量的数量必须跟序列元素的数量一样的。​ 代码示例:p=(4,5)x,y=p#输出 x的值:4,y的值:5data = ['ACME', 50, 91.1, (2012, 12, 21)]name, shares, price, (year, mon, day)

2022-02-23 15:44:06 92

原创 1.2解压可迭代对象赋值给多个变量

问题​ 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个ValueError。那么怎样才能从这个可迭代对象中解压出N个元素出来?解决方案​ Python的信号表达式可以用来解决这个问题。比如,你在学习一门课程,在学期末的时候,你想统计家庭作业的平均成绩,但是排序第一个和最后一个分数。如果只有4个分数,你可能就直接去简单的手动赋值,但是如果有24个呢?这个时候星号表达式就派上用场了:from audioop import avgdef drop_first_last(grades):

2022-02-23 15:43:52 200

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除