1.41 函数max()
在Python程序中,使用函数max()的语法格式如下所示。
max(iterable, *[, key, default])
max(arg1, arg2, *args[, key])
参数arg1、arg2和args可以都是数值表达式,函数max()的功能是返回给定参数的最大值。因为参数可以为序列,所以函数max()的也能返回传入的多个参数中的最大值,或者传入的可迭代对象元素中的最大值。默认数值型参数取值大者,字符型参数取字母表排序靠后者。还可以传入命名参数key,其为一个函数,用来指定取最大值的方法。命名参数default用来指定最大值不存在时返回的默认值。函数max()至少传入两个参数,但是有只传入一个参数的例外,此时参数必须为可迭代对象,返回的是可迭代对象中的最大元素。
在下面的实例文件max.py中,演示了使用函数max()获取最大值的过程。
print ("max(80, 100, 1000) : ", max(80, 100, 1000))
print ("max(-20, 100, 400) : ", max(-20, 100, 400))
print ("max(-80, -20, -10) : ", max(-80, -20, -10))
print ("max(0, 100, -400) : ", max(0, 100, -400))
print(max(1,2))# 传入2个参数 取2个中较大者
print(max(1,2,3))# 传入3个参数 取3个中较大者
print(max('1234'))# 传入1个参数不会报错,因为传入了1个可迭代对象,取其最大元素值
#print(max(1)) # 传入1个参数报错
执行后会输出:
max(80, 100, 1000) : 1000
max(-20, 100, 400) : 400
max(-80, -20, -10) : -10
max(0, 100, -400) : 100
2
3
4
当传入函数max()参数的数据类型不一致时,传入的所有参数将进行隐式数据类型转换后再比较,如果不能进行隐式数据类型转换则会报错。例如下面的演示过程。
>>> max(1,1.1,1.3E1) # 整数与浮点数可取最大值
13.0
>>> max(1,2,3,'3') # 数值与字符串不能取最大值
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
max(1,2,3,'3')
TypeError: unorderable types: str() > int()
>>> max([1,2],[1,3]) # 列表与列表可取最大值
[1, 3]
>>> max([1,2],(1,3)) # 列表与元组不能取最大值
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
max([1,2],(1,3))
TypeError: unorderable types: tuple() > list()
当存在多个相同的最大值时,函数max()返回的是最先出现的那个最大值。例如下面的演示过程。
#定义a、b、c 3个列表
>>> a = [1,2]
>>> b = [1,1]
>>> c = [1,2]
#查看a、b、c 的id
>>> id(a)
68128320
>>> id(b)
68128680
>>> id(c)
68128240
#取最大值
>>> d = max(a,b,c)
>>> id(d)
68128320
#验证是否最大值是否是a
>>> id(a) == id(d)
True
如果函数max()是默认数值型参数则取值大者,如果是字符型参数则取字母表排序靠后者,函数max()序列型参数则依次按索引位置的值进行比较取最大者。另外,还可以通过传入命名参数key来指定取最大值方法。例如下面的演示过程。
>>> max(1,2) # 取数值大者
2
>>> max('a','b') # 取排序靠后者
'b'
>>> max('ab','ac','ad') # 依次按索引比较取较大者
'ad'
>>> max(-1,0) # 数值默认去数值较大者
0
>>> max(-1,0,key = abs) # 传入了求绝对值函数,则参数都会进行求绝对值后再取较大者
-1
在函数max()中,参数key的另外一个作用是不同类型对象本来不能比较取最大值的,传入合适的key参数后,函数max()会变得更好的能取最大值。例如下面的演示过程。
>>> max(1,2,'3') #数值和字符串不能取最大值
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
max(1,2,'3')
TypeError: unorderable types: str() > int()
>>> max(1,2,'3',key = int) # 指定key为转换函数后,可以取最大值
'3'
>>> max((1,2),[1,1]) #元组和列表不能取最大值
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
max((1,2),[1,1])
TypeError: unorderable types: list() > tuple()
>>> max((1,2),[1,1],key = lambda x : x[1]) #指定key为返回序列索引1位置的元素后,可以取最大值
(1, 2)
当函数max()只传入的一个可迭代对象时,而且可迭代对象为空,则必须指定命名参数default,用来指定最大值不存在时函数返回的默认值。例如下面的演示过程。
>>> max(()) #空可迭代对象不能取最大值
Traceback (most recent call last):
File "<pyshell#26>", line 1, in <module>
max(())
ValueError: max() arg is an empty sequence
>>> max((),default=0) #空可迭代对象,指定default参数为默认值
0
>>> max((),0) #默认值必须使用命名参数进行传参,否则将被认为是一个比较的元素
Traceback (most recent call last):
File "<pyshell#27>", line 1, in <module>
max((),0)
TypeError: unorderable types: int() > tuple()
1.42 函数memoryview()
在Python程序中,使用函数memoryview()的语法格式如下所示。
memoryview(obj)
参数“obj”是一个对象,函数memoryview()的功能是返回给定参数的内存查看对象(Momory view)。所谓内存查看对象,是指对支持缓冲区协议的数据进行包装,在不需要复制对象基础上允许Python代码访问。在Python内置对象中,支持缓冲区协议的对象有bytes和bytearray。
在下面的实例文件mem.py中,演示了使用函数memoryview()获取内存对象的过程。
v = memoryview(bytearray("abcefg", 'utf-8'))
print(v[1])
print(v[-1])
print(v[1:4])
print(v[1:4].tobytes())
执行后会输出:
98
103
<memory at 0x00000206E0778348>
b'bce'
1.43 函数min()
在Python程序中,使用函数min()的语法格式如下所示。
min(iterable, *[, key, default])
min(arg1, arg2, *args[, key])
函数min()的功能是返回可迭代的对象中的最小的元素,或者返回2个或多个参数中的最小的参数。函数min()的参数默认为数值型,取值小者;如果是字符型参数,则取字母表排序靠前者。还可以传入命名参数key,其为一个函数,用来指定取最小值的方法。命名参数default用来指定最小值不存在时返回的默认值。功能与max函数相反。
函数min()至少传入两个参数,但是有只传入一个参数的例外,此时参数必须为可迭代对象,返回的是可迭代对象中的最小元素。例如下面的演示过程。
>>> min(1) # 传入1个参数报错
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
min(1)
TypeError: 'int' object is not iterable
>>> min(1,2) # 传入2个参数 取2个中较小者
1
>>> min(1,2,3) # 传入3个参数 取3个中较小者
1
>>> min('1234') # 传入1个可迭代对象,取其最小元素值
'1'
当函数min()传入参数为数据类型不一致时,传入的所有参数将进行隐式数据类型转换后再比较,如果不能进行隐式数据类型转换时会报错。例如下面的演示过程。
>>> min(1,1.1,1.3e1) # 整数与浮点数可取最小值
1
>>> min(1,2,'3') # 数值与字符串不能取最小值
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
min(1,2,'3')
TypeError: unorderable types: str() < int()
>>> min([1,2],[1,3]) # 列表与列表可取最小值
[1, 2]
>>> min((1,2),[1,3]) # 列表与元组不能取最小值
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
min((1,2),[1,3])
TypeError: unorderable types: list() < tuple()
当函数min()有多个相同的最小值时,返回的是最先出现的那个最小值。例如下面的演示过程。
#定义a、b、c 3个列表
>>> a = [1,2]
>>> b = [1,3]
>>> c = [1,2]
#查看a、b、c 的id
>>> id(a)
66486184
>>> id(b)
66486224
>>> id(c)
66486024
#取最小值
>>> d = min(a,b,c)
>>> id(d)
66486184
#验证是否最小值是否是a
>>> id(a) == id(d)
True
函数min()的默认参数类型为数值型,此时取值小者;如果是字符型参数,取字母表排序靠前者;如果是序列型参数,则依次按索引位置的值进行比较取最小者。还可以通过传入命名参数key,指定取最小值方法。例如下面的演示过程。
>>> min(1,2) # 取数值小者
1
>>> min('a','b') # 取排序靠前者
'a'
>>> min('ab','ac','ad') # 依次按索引比较取较小者
'ab'
>>> min(-1,-2) # 数值默认去数值较小者
-2
>>> min(-1,-2,key = abs) # 传入了求绝对值函数,则参数都会进行求绝对值后再取较小者
-1
在函数min()中,参数key的另外一个作用是,不同类型对象本来不能比较取最小值的,传入适当的key函数,变得可以比较能取最小值了。例如下面的演示过程。
>>> min(1,2,'3') #数值和字符串不能取最小值
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
min(1,2,'3')
TypeError: unorderable types: str() < int()
>>> min(1,2,'3',key = int) # 指定key为转换函数后,可以取最小值
1
>>> min([1,2],(1,1)) #元组和列表不能取最小值
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
min([1,2],(1,1))
TypeError: unorderable types: tuple() < list()
>>> min([1,2],(1,1),key = lambda x:x[1]) #指定key为返回序列索引1位置的元素后,可以取最小值
(1, 1)
当函数min()只传入的一个可迭代对象时,而且可迭代对象为空,则必须指定命名参数default,用来指定最小值不存在时,函数返回的默认值。例如下面的演示过程。
>>> min(()) #空可迭代对象不能取最小值
Traceback (most recent call last):
File "<pyshell#26>", line 1, in <module>
min(())
ValueError: min() arg is an empty sequence
>>> min((),default = 0) #空可迭代对象,指定default参数为默认值
0
>>> min((),0) #默认值必须使用命名参数进行传参,否则将被认为是一个比较的元素
Traceback (most recent call last):
File "<pyshell#27>", line 1, in <module>
min((),0)
TypeError: unorderable types: int() < tuple()
1.44 函数next()
在Python程序中,使用函数next()的语法格式如下所示。
next(iterator[, default])
- iterator:可迭代对象;
- default:可选参数,用于设置在没有下一个元素时返回该默认值。如果不设置这个参数,又没有下一个元素则会触发 StopIteration异常。
函数next()的功能是返回迭代器的下一个项目,通过调用__next__()方法从迭代器中检索下一个项目。如果有参数default,在迭代器迭代完所有元素之后返回该参数;否则会抛出StopIteration。
在下面的实例文件next.py中,演示了使用函数next()迭代元素对象的过程。
a = iter('abcd')
print(next(a,'e'))
print(next(a,'e'))
print(next(a,'e'))
print(next(a,'e'))
print(next(a,'e'))
print(next(a,'e'))
# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
print(x)
except StopIteration:
# 遇到StopIteration就退出循环
break
执行后会输出:
a
b
c
d
e
e
1
2
3
4
5
1.45 函数oct(x)
在Python程序中,使用函数oct(x)的语法格式如下所示。
oct(x)
参数x是一个整数,函数oct(x)的功能是将一个整数转换成8进制字符串。如果x不是Python int对象,则必须定义一个返回整数的__index__()方法。
在下面的实例文件oct.py中,演示了使用函数oct(x)进行数据转换的过程。
a = oct(10)
print(a)
print(type(a))# 返回结果类型是字符串
#print(oct(10.0)) # 浮点数不能转换成8进制
#print(oct('10')) # 字符串不能转换成8进制
执行后会输出:
0o12
<class 'str'>
如果函数oct(x)传入的参数不是整数,则其必须是一个定义了__index__并返回整数函数的类的实例对象。例如下面的实例文件oct1.py说明了这一点。
# 未定义__index__函数,不能转换
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
a = Student('Kim', 10)
#print(oct(a))#不能转换,运行后会出错
# 定义了__index__函数,但是返回值不是int类型,不能转换
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __index__(self):
return self.name
a = Student('Kim', 10)
#print(oct(a))#不能转换,运行后会出错
# 定义了__index__函数,而且返回值是int类型,能转换
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def __index__(self):
return self.age
a = Student('Kim', 10)
print(oct(a))
执行后会输出:
0o12