Python标准内置函数(21-25)

版权声明:CSDN原创,请尊重三叔的版权,进Python学习乐园 群: 668758148,大家一起学习! https://blog.csdn.net/asd343442/article/details/84190077

1.21  函数filter()

在Python程序中,函数filter()的功能是过滤序列,过滤掉不符合条件的元素,返回一个filter类。filter类实现了__iter__和__next__方法, 可以看成是一个迭代器, 有惰性运算的特性。使用函数filter()的语法格式如下所示。

filter(function, iterable)
  1. function:判断函数;
  2. 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])
  1. object:是一个对象,函数getattr()的功能是从对象object中获取名为name的属性,等效与调用object.name。
  2. name:对象属性,name必须是一个字符串。如果字符串是对象某个属性的名字,则返回该属性的值。例如,getattr(x, 'foobar')等同于x.foobar。如果这个名字的属性不存在,如果提供default则返回它,否则引发AttributeError。
  3. 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'

猜你喜欢

转载自blog.csdn.net/asd343442/article/details/84190077
今日推荐