1.51 函数range()
在Python程序中,使用函数range()的语法格式如下所示。
range(stop)
range(start, stop[, step])
- start:计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
- end:计数到 end 结束,但不包括 end。例如range(0, 5) 是[0, 1, 2, 3, 4]没有5;
- step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)。
函数range()的功能是创建一个整数列表,一般被用在 for 循环中。例如在下面的实例文件range.py中,演示了使用函数range()定义一个可控属性值 x的过程。
#可以直接传入一个结束整数来初始化一个range类型,默认起始值为0(包含0).
# 结束整数可以大于0,也可以小于等于0,但是小于等于0的时候生成的range对象实际是不包含任何元素的。
a = range(5)
print(a)
range(0, 5)
print(len(a))
for x in a:print(x)
#可以传入一个起始整数和一个结束整数来初始化一个range类型,
# 生成的range类型包含起始整数(包含),和结束整数(不包含)之间的所有整数。
a = range(1,5)
print(a)
range(1, 5)
for x in a:print(x)
#传入了起始整数和结束整数,还可以同时传入一个步进值来初始化一个range类型,
# 生成的range类型包含起始整数(包含),和结束整数(不包含)之间的以步进值筛选后的整数。
a = range(1,10,3)
print(a)
range(1, 10, 3)
for x in a:print(x)
#初始化range类型时起始整数和结束整数,遵循的是左臂右开原则,即包含起始整数,但不包含结束整数。
a = range(1,5)
print(a)
range(1, 5)
for x in a:print(x) # 包含1,不包含5
执行后会输出:
range(0, 5)
5
0
1
2
3
4
range(1, 5)
1
2
3
4
range(1, 10, 3)
1
4
7
range(1, 5)
1
2
3
4
函数range()接收的参数都必须是整数,不能是浮点数等其它数据类型,否则运行后会出错。例如下面的演示过程。
>>> a = range(3.5)
Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
a = range(3.5)
TypeError: 'float' object cannot be interpreted as an integer
>>> a = range('3.5')
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
a = range('3.5')
TypeError: 'str' object cannot be interpreted as an integer
函数range()实际上是一个不可变的序列类型,可以对它进行取元素、切片等序列操作,但是不能对其中元素修改值。例如下面的演示过程。
>>> a = range(1,5)
>>> a[0] # 取元素
1
>>> a[:-2] # 切片
range(1, 3)
>>> a[1] = 2 # 修改元素值
Traceback (most recent call last):
File "<pyshell#38>", line 1, in <module>
a[1] = 2
TypeError: 'range' object does not support item assignment
1.52 函数repr()
在Python程序中,使用函数repr()的语法格式如下所示。
repr(object)
函数repr()的功能是返回参数对象object可打印形式的字符串,其功能和str()函数比较类似,但是两者也有差异:函数str()用于将值转化为适于人阅读的形式,而函数repr()转化为供解释器读取的形式。
例如在下面的实例文件repr.py中,演示了使用函数repr()将对象转化为可打印形式的字符串的过程。
a = 'some text'
print(str(a))
print(repr(a))
# repr函数的结果一般能通过eval()求值的方法获取到原对象。
print(eval(repr(a)))
#对于一般的类型,对其实例调用repr函数返回的是其所属的类型和被定义的模块,以及内存地址组成的字符串。
class Student:
def __init__(self,name):
self.name = name
a = Student('Bob')
print(repr(a))
#如果要改变类型的repr函数显示信息,需要在类型中定义__repr__函数进行控制。
class Student:
def __init__(self,name):
self.name = name
def __repr__(self):
return ('a student named ' + self.name)
b = Student('Kim')
print(repr(b))
执行后会输出:
some text
'some text'
some text
<__main__.Student object at 0x000001869D89F438>
a student named Kim
1.53 函数reversed()
在Python程序中,使用函数reversed()的语法格式如下所示。
reversed(seq)
参数“seq”表示要转换的序列,可以是 tuple、string、list或range类型。函数reversed()的功能是返回一个反转的iterator迭代器。seq必须是一个具有__reversed__() 方法或支持序列协议的对象(整数参数从0开始的__len__()方法和__getitem__() 方法)。
例如在下面的实例文件reversed.py中,演示了使用函数reversed()返回一个反转的迭代器的过程。
# 字符串
seqString = 'Toppr'
print(list(reversed(seqString)))
# 元组
seqTuple = ('T', 'o', 'p', 'p', 'r')
print(list(reversed(seqTuple)))
# range
seqRange = range(5, 7)
print(list(reversed(seqRange)))
# 列表
seqList = [1, 2, 4, 3, 5]
print(list(reversed(seqList)))
#功能是反转一个序列对象,将其元素从后向前颠倒构建成一个新的迭代器。
a = reversed(range(10)) # 传入range对象
print(a)# 类型变成迭代器
print(list(a))
a = ['a','b','c','d']
print(a)
print(reversed(a))# 传入列表对象
b = reversed(a)
print(b)# 类型变成迭代器
print(list(b))
执行后会输出:
['r', 'p', 'p', 'o', 'T']
['r', 'p', 'p', 'o', 'T']
[6, 5]
[5, 3, 4, 2, 1]
<range_iterator object at 0x0000022A18CCDF30>
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
['a', 'b', 'c', 'd']
<list_reverseiterator object at 0x0000022A17ADFB00>
<list_reverseiterator object at 0x0000022A17ADFB00>
['d', 'c', 'b', 'a']
如果函数reversed()的参数不是一个序列对象,则必须定义一个__reversed__方法。例如下面的演示过程。
# 类型Student没有定义__reversed__方法
>>> class Student:
def __init__(self,name,*args):
self.name = name
self.scores = []
for value in args:
self.scores.append(value)
>>> a = Student('Bob',78,85,93,96)
>>> reversed(a) # 实例不能反转
Traceback (most recent call last):
File "<pyshell#37>", line 1, in <module>
reversed(a)
TypeError: argument to reversed() must be a sequence
>>> type(a.scores) # 列表类型
<class 'list'>
# 重新定义类型,并为其定义__reversed__方法
>>> class Student:
def __init__(self,name,*args):
self.name = name
self.scores = []
for value in args:
self.scores.append(value)
def __reversed__(self):
self.scores = reversed(self.scores)
>>> a = Student('Bob',78,85,93,96)
>>> a.scores # 列表类型
[78, 85, 93, 96]
>>> type(a.scores)
<class 'list'>
>>> reversed(a) # 实例变得可以反转
>>> a.scores # 反转后类型变成迭代器
<list_reverseiterator object at 0x0342F3B0>
>>> type(a.scores)
<class 'list_reverseiterator'>
>>> list(a.scores)
[96, 93, 85, 78]
1.54 函数round()
在Python程序中,使用函数round()的语法格式如下所示。
round(number[, ndigits])
函数round()的功能是返回浮点数x的四舍五入值,也就是返回参数number舍入到小数点后ndigits位的浮点值。如果省略参数ndigits,将返回最接近输入的整数。底层调用的是number.__round__(ndigits)。对于支持round()的内建类型来说,值舍入到10的最接近的负ndigits次幂的倍数;如果离两个倍数的距离相等,则舍入选择偶数(因此,round(0.5)和round(-0.5)都是0,而round(1.5)是2)。如果使用一个参数调用,返回值是一个整数,否则类型与number相同。
例如在下面的实例文件round.py中,演示了使用函数round()返回浮点数四舍五入值过程。
print ("round(70.23456) : ", round(70.23456))
print ("round(56.659,1) : ", round(56.659,1))
print ("round(80.264, 2) : ", round(80.264, 2))
print ("round(100.000056, 3) : ", round(100.000056, 3))
print ("round(-100.000056, 3) : ", round(-100.000056, 3))
#具体保留几位小数,以传入的ndigits参数来控制。
print(round(1.1314926,1))
print(round(1.1314926,5))
#ndigits参数为可选参数,当不传入时,即以默认保留0位小数进行取整,返回的是整数。
print(round(1.1314926))
#ndigits参数传入0时,虽然与不传入ndigits参数一样保留0位小数进行四舍五入,但是返回的值是浮点型。
print(round(1.1314926,0))
#ndigits参数小于0时,对整数部分进行四舍五入,ndigits参数控制了对浮点数的整数部分的后几位进行四舍五入,
# 小数部分全部清0,返回类型是浮点数。如果传入的浮点数的整数部分位数小于ndigits参数绝对值,则返回0.0.
print(round(11314.926,-1))
print(round(11314.926,-3))
print(round(11314.926,-4))
print(round(11314.926,-5))
#round四舍五入时是遵循靠近0原则,所以-0.5和0.5进行0位四舍五入,返回的都是0.
print(round(0.5))
print(round(-0.5))
#对于浮点数求四舍五入有一个陷阱,有些四舍五入结果不像预期那样,
# 比如round(1.675, 2) 的结果是1.67 而不是预期的 1.68,这不是bug,
# 而是浮点数在存储的时候因为位数有限,实际存储的值和显示的值有一定误差。
print(round(1.675, 2))
#对整数也能进行round操作,返回值也是整形。
print(round(134567))
print(round(134567,0))
print(round(134567,1))
print(round(134567,2))
print(round(134567,-2))
print(round(134567,-6))
执行后会输出:
round(70.23456) : 70
round(56.659,1) : 56.7
round(80.264, 2) : 80.26
round(100.000056, 3) : 100.0
round(-100.000056, 3) : -100.0
1.1
1.13149
1
1.0
11310.0
11000.0
10000.0
0.0
0
0
1.67
134567
134567
134567
134567
134600
0
1.55 函数set()
在Python程序中,使用函数set()的语法格式如下所示。
class set([iterable])
函数set()的功能是创建一个无序不重复元素集,可以进行关系测试,删除重复数据,还可以计算交集、差集和并集等。执行函数set()后会返回一个新的set 对象,其元素可以从可选的参数iterable中获得。
例如在下面的实例文件set.py中,演示了使用函数set()返回一个反转的迭代器的过程。
x = set('toppr')
y = set('google')
print(x, y)
print(x & y) # 交集
set(['o'])
print(x | y) # 并集
print(x - y) # 差集
#传入一个可迭代对象,生成一个新的集合。
a = set(range(10))
print(a)
#不传入参数时,生成一个新的空集合。
a = set()
print(a)
#返回的集合是可以修改的。
a = set()
print(a)
a.add(1)
print(a)
执行后会输出:
{'r', 't', 'o', 'p'} {'o', 'e', 'g', 'l'}
{'o'}
{'r', 'l', 'g', 'e', 'o', 't', 'p'}
{'r', 't', 'p'}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
set()
set()
{1}