1.21 函数filter()
在Python程序中,函数filter()的功能是过滤序列,过滤掉不符合条件的元素,返回一个filter类。filter类实现了__iter__和__next__方法, 可以看成是一个迭代器, 有惰性运算的特性。使用函数filter()的语法格式如下所示。
filter(function, iterable)
- function:判断函数;
- iterable:可迭代对象。
在下面的实例文件filter.py中,演示了使用函数filter()过滤数据的过程。
# 过滤出列表中的所有奇数:
def is_odd(n):
return n % 2 == 1
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
①print(newlist)
print(list(newlist))
#过滤出1~100中平方根是整数的数
import math
def is_sqr(x):
return math.sqrt(x) % 1 == 0
newlist = filter(is_sqr, range(1, 101))
②print(newlist)
print(list(newlist))
执行后会输出:
<filter object at 0x000002021CFDF668>
[1, 3, 5, 7, 9]
<filter object at 0x000002021CFDF588>
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
在Python 2版本中,①行代码执行后会输出列表“[1, 3, 5, 7, 9]”,②行代码执行后会输出列表“[[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]]”,这是因为Python 2版本返回的是过滤后的列表, 而Python 3版本中返回到是一个filter类。要想在Python 3程序中返回过滤后的列表,需要使用函数list()将其转化过来。
1.22 函数float()
在Python程序中,函数float()的功能是将整数和字符串转换成浮点数。使用函数float()的语法格式如下所示。
class float([x])
参数“x”是一个整数或字符串,如果参数“x”是一个字符串,它应该包含一个十进制数,可选地前面有一个符号,并且可选地嵌入在空格中。可选的sign可以是'+'或'–'; '+'符号对生成的值没有影响。参数“x”还可以是表示NaN(非数字)或正或负无穷大的字符串。更确切地说,输入必须符合如下所示的语法,前导和尾随空白字符被删除:
sign ::= "+" | "-"
infinity ::= "Infinity" | "inf"
nan ::= "nan"
numeric_value ::= floatnumber | infinity | nan
numeric_string ::= [sign] numeric_value
在上述格式中,floatnumber是在浮点字面值中描述的Python浮点字面值的形式。例如“inf”、“Inf”、“INFINITY”和“iNfINity”都是正无穷大的可接受拼写。如果参数“x”是整数或浮点数,则返回具有相同值(在Python的浮点精度内)的浮点数。如果参数“x”在Python浮点数的范围之外,则引发一个OverflowError错误。对于一般的Python对象x,float(x)委托给x .__float__()。如果没有给出参数“x”,则返回0.0。
在下面的实例文件fl.py中,演示了使用函数float()将参数转换为浮点数的过程。
print(float(1))
print(float(112))
print(float(-123.6))
print(float('123') ) # 字符串
print( float())#不提供参数的时候,返回0.0
执行后会输出:
1.0
11.0
-123.6
123.0
0.0
在使用函数float()时,字符串必须能正确转换成浮点型数值的,否则报错。例如下面的演示过程。
>>> float('3.14.15926')
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
float('3.14.15926')
ValueError: could not convert string to float: '3.14.15926'
在使用函数float()时,在字符串中允许出现“+”、“-”两个符号,两个符号和数字之间不能出现空格,但是符号前面和数字后面允许出现空格。例如下面的演示过程。
>>> float('+3.14') #带正号
3.14
>>> float('-3.14') #带负号
-3.14
>>> float(' -3.14 ') #正负号前、数字后可以有空格
-3.14
>>> float('- 3.14') #正负号与数字间不可以有空格
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
float('- 3.14')
ValueError: could not convert string to float: '- 3.14'
在使用函数float()时,有几个特殊的字符串能正确转换,例如"Infinity"或者“inf”(不区分大小写),能正确转换,表示无穷大,可以和“+”、“-”一起使用;“nan”也能正确转换,表示没有值。例如下面的实例文件fl1.py演示了函数float()的这一功能。
print(float('Infinity'))
print(float('inf'))
print(float('inFinIty')) #不区分大小写
print(float('+inFinIty'))#正无穷
print(float('-inFinIty')) #负无穷
print(float('nan'))#没有值
执行后会输出:
inf
inf
inf
inf
-inf
Nan
在Python程序中,定义的对象如果要被float()函数正确转换成浮点数,则需要定义__float__函数。例如执行下面的代码将会报错:
>>> class X:
def __init__(self,score):
self.score = score
>>> x = X(9.7)
>>> float(x) #不能转换
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
float(x)
TypeError: float() argument must be a string or a number, not 'X'
而执行下面的实例文件fl2.py就会成功。
class X: #重新定义类,加入__float__方法
def __init__(self,score):
self.score = score
def __float__(self):
return self.score
x = X(9.7)
print(float(x))#可以转换
执行后会输出:
9.7
1.23 函数format()
在Python程序中,函数format()是一种格式化字符串的函数,它增强了字符串格式化的功能。使用函数format()的语法格式如下所示。
format(value[, format_spec])
函数format()的功能是将value转化成“格式化”的表现形式,格式由format_spec控制。对format_spec的解释依赖于参数value的类型,大多数内置类型有标准的格式化语法。format_spec是一个格式化参数,默认是一个空字符串,通常给出与调用str(value)相同的效果。对参数format_spec的调用将被转换为type(value).__ format __(value, t4> format_spec)其在搜索值的__format__()方法时绕过实例字典。如果方法搜索到达object并且format_spec不为空,或者如果format_spec,则会引发TypeError t7>或返回值不是字符串。
如果没有提供参数format_spec,则和调用str(value)效果相同,转换成字符串格式化。
在使用函数format()时,可以接受不限个数的参数,位置可以不按顺序排列。例如下面的实例文件for.py演示了函数format()的这一功能。
print("{} {}".format("hello", "world")) # 不设置指定位置,按默认顺序
print("{0} {1}".format("hello", "world")) # 设置指定位置
print("{1} {0} {1}".format("hello", "world")) # 设置指定位置
执行后会输出:
hello world
hello world
world hello world
在使用函数format()时,也可以设置指定的参数,例如下面的实例文件for1.py演示了函数format()的这一功能。
print("网站名:{name}, 地址 {url}".format(name="Python教程", url="www.toppr.net"))
# 通过字典设置参数
site = {"name": "Python教程", "url": "www.toppr.net"}
print("网站名:{name}, 地址 {url}".format(**site))
# 通过列表索引设置参数
my_list = ['Python教程', 'www.toppr.net']
print("网站名:{0[0]}, 地址 {0[1]}".format(my_list)) # "0" 是必须的
执行后会输出:
网站名:Python教程, 地址 www.toppr.net
网站名:Python教程, 地址 www.toppr.net
网站名:Python教程, 地址 www.toppr.net
在使用函数format()时,也可以向函数str.format()传入对象,例如下面的实例文件for2.py演示了函数format()的这一功能。
class AssignValue(object):
def __init__(self, value):
self.value = value
my_value = AssignValue(6)
print('value 为: {0.value}'.format(my_value)) # "0" 是可选的
执行后会输出:
value 为: 6
在Python程序中,函数format()实现数字格式化功能的说明如表1-1所示。
表1-1 实现数字格式化功能的说明
数字 |
格式 |
输出 |
描述 |
3.1415926 |
{:.2f} |
3.14 |
保留小数点后两位 |
3.1415926 |
{:+.2f} |
+3.14 |
带符号保留小数点后两位 |
-1 |
{:+.2f} |
-1.00 |
带符号保留小数点后两位 |
2.71828 |
{:.0f} |
3 |
不带小数 |
5 |
{:0>2d} |
05 |
数字补零 (填充左边, 宽度为2) |
5 |
{:x<4d} |
5xxx |
数字补x (填充右边, 宽度为4) |
10 |
{:x<4d} |
10xx |
数字补x (填充右边, 宽度为4) |
1000000 |
{:,} |
1,000,000 |
以逗号分隔的数字格式 |
0.25 |
{:.2%} |
25.00% |
百分比格式 |
1000000000 |
{:.2e} |
1.00e+09 |
指数记法 |
13 |
{:10d} |
13 |
右对齐 (默认, 宽度为10) |
13 |
{:<10d} |
13 |
左对齐 (宽度为10) |
13 |
{:^10d} |
13 |
中间对齐 (宽度为10) |
11 |
'{:b}'.format(11) '{:d}'.format(11) '{:o}'.format(11) '{:x}'.format(11) '{:#x}'.format(11) '{:#X}'.format(11) |
1011 11 13 b 0xb 0XB |
进制 |
其中^、<、> 分别是居中、左对齐、右对齐,后面带宽度, : 号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。+ 表示在正数前显示 +,负数前显示 -; (空格)表示在正数前加空格。b、d、o、x 分别是二进制、十进制、八进制、十六进制。此外还可以使用大括号{}来转义大括号,例如下面的演示代码:
print ("{} 对应的位置是 {{0}}".format("runoob"))
执行后会输出:
runoob 对应的位置是 {0}
1.24 函数frozenset()
在Python程序中,函数frozenset()的功能是返回一个冻结的集合,冻结后的集合不能再添加或删除任何元素。使用函数frozenset()的语法格式如下所示。
class frozenset([iterable])
函数frozenset()能够返回一个新的frozenset对象,参数iterable 是一个可迭代的对象,例如列表、字典、元组等等。如果可选参数iterable存在,则frozenset的元素来自于iterable。
例如在下面的实例文件fro.py中,演示了使用函数frozenset()处理结合元素的过程。
#传入一个可迭代对象,生成一个新的不可变集合
a = frozenset(range(10))
print(a)
frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
b = frozenset('I am a Pythoner')
print(b)
#不传入参数时,生成的空的不可变集合。
c = frozenset()
print(c)
执行后会输出:
frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
frozenset({'P', 'h', ' ', 'I', 'y', 't', 'e', 'm', 'n', 'a', 'r', 'o'})
frozenset()
1.25 函数getattr()
在Python程序中,函数getattr()的功能是返回一个对象属性值。使用函数getattr()的语法格式如下所示。
getattr(object, name[, default])
- object:是一个对象,函数getattr()的功能是从对象object中获取名为name的属性,等效与调用object.name。
- name:对象属性,name必须是一个字符串。如果字符串是对象某个属性的名字,则返回该属性的值。例如,getattr(x, 'foobar')等同于x.foobar。如果这个名字的属性不存在,如果提供default则返回它,否则引发AttributeError。
- default:默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
例如在下面的实例文件get.py中,演示了使用函数getattr()获取对象属性的过程。
# 定义类Student
class Student:
def __init__(self, name):
self.name = name
s = Student('Aim')
print(getattr(s, 'name')) # 等效于调用s.name
print(s.name)
执行后会输出:
Aim
Aim
在函数getattr()中,第三个参数default为可选参数,如果在对象object中包含属性name,则返回属性name的值。如果没有属性name,则返回default值。如果default未传入值,则报错。例如下面的实例文件get1.py演示了函数getattr()的这一用法。
#定义类Student
class Student:
def __init__(self,name):
self.name = name
s = Student('Aim')
print(getattr(s,'name'))#存在属性name
print(getattr(s,'age',6))#不存在属性age,但提供了默认值,返回默认值6
print(getattr(s,'age') )#不存在属性age,未提供默认值,调用报错
执行后会输出:
Aim
Traceback (most recent call last):
6
File "get1.py", line 9, in <module>
print(getattr(s,'age') )#不存在属性age,未提供默认值,调用报错
AttributeError: 'Student' object has no attribute 'age'