文章目录
丢弃小数部分的整除
>>> 1 // 2
> 0
>>> 1 // 1
> 1
>>> 5.0 // 2.4
> 2.0
整除还能对浮点数进行
取余
下面介绍不好理解的
>>> 10 % -3
> -2
>>> -10 % 3
> 2
>>> -10 % -3
> -1
通过研究与之配套的整除运算可帮助理解
即先整除,然后减去
-10 // -3 为 3.3333 取整(注意取整为向下取整,-3.3变整数后即为-4)变为3,则再取余就为-1
同理10%-3为-2,-10%3为2
乘方
这里值得注意的地方就是乘方运算符**的优先级比求负的优先级高,因此-3**2等价于-(3**2)。
获取用户输入
>>> x = input("x:")
>x: 34
>>> y = input("y:")
>y: 42
>>> print(int(x)*int(y))
>1428
内置函数
- round和//
round()是圆整到最接近的整数,并在两个整数一样近时圆整到偶数。
//是向下圆整
直接对于一个数的向下圆整可以用math模块中的floor
math模块
- floor
直接对数字进行向下取整
- ceil
直接对数字进行向上取整
cmath模块
专门处理复数的模块
问题
当默认打开程序为python.exe的时候,双击运行后会直接闪一下就退出了,要在程序的末尾加上input(Press <enter>)
即可
输出时转换成字符串的不同机制
- str
对符号进行解释
- repr
保持原来内容
>>>print(repr("hello,\nworld"))
> 'hello,\nworld'
>>>print(str("hello,\nworld"))
>hello,
>world
长字符串、原始字符串和字节
- 长字符串
要表示很长的字符串(跨越多行的字符串),可以使用三引号
print('''This is a very long string.It continues here.
And it's not over yet."hello,world"
Still here.''')
- 原始字符串
原始字符串不会对反斜杠做特殊处理,而是让字符串包含的每个字符都保持原样
>>> print(r'C:\nowhere')
>>> print(r'C:\Program Files\fnord\foo\bar\baz\frozz\bozz')
列表(list)和元组(tuple)
- 区别
列表是可以修改的,元组不能修改
列表是同构的,元组是异构的
同构 与 异构:tuple 用于存储异构(heterogeneous)数据,当做没有字段名的记录来用,比如用 tuple 来记录一个人的身高、体重、年龄。而列表一般用于存储同构数据(homogenous),同构数据就是具有相同意义的数据,雅思考试内容比如下面的都是字符串类型
容器
Python支持一种数据结构的基本概念,名为容器(container)。容器基本上就是可包含其他对象的对象。两种主要的容器是序列(如列表和元组)和映射(如字典)。在序列中,每个元素都有编号,而在映射中,每个元素都有名称(也叫键)。有一种既不是序列也不是映射的容器,它就是集合(set)
通用的序列操作
索引
对于字符串字面量(以及其他的序列字面量),可直接对其执行索引操作,无需先将其赋给
变量。这与先赋给变量再对变量执行索引操作的效果是一样的。
>>> 'Hello'[1]
'e'
如果函数调用返回一个序列,可直接对其执行索引操作。例如,如果你只想获取用户输入的年份的第4位,可像下面这样做:
>>> fourth = input('Year: ')[3]
Year: 2005
>>> fourth
'5'
切片
除使用索引来访问单个元素外,还可使用切片(slicing)来访问特定范围内的元素。为此,
可使用两个索引,并用冒号分隔:
>>> tag = '<a href="http://www.python.org">Python web site</a>'
>>> tag[9:30]
'http://www.python.org'
>>> tag[32:-4]
'Python web site'
其中第一个索引指定的元素包含在切片内,但第二个索引指定的元素不包含在切片内。
###绝妙的简写
假设你要访问前述数字列表中的最后三个元素,显然可以明确地指定这一点。
>>> numbers[7:10]
[8, 9, 10]
在这里,索引10指的是第11个元素:它并不存在,但确实是到达最后一个元素后再前进一步
所处的位置。明白了吗?如果要从列表末尾开始数,可使用负数索引。
>>> numbers[-3:-1]
[8, 9]
然而,这样好像无法包含最后一个元素。如果使用索引0,即到达列表末尾后再前进一步所
处的位置,结果将如何呢?
>>> numbers[-3:0]
[]
结果并不是你想要的。事实上,执行切片操作时,如果第一个索引指定的元素位于第二个索
引指定的元素后面(在这里,倒数第3个元素位于第1个元素后面),结果就为空序列。好在你能
使用一种简写:如果切片结束于序列末尾,可省略第二个索引。
>>> numbers[-3:]
[8, 9, 10]
同样,如果切片始于序列开头,可省略第一个索引。
>>> numbers[:3]
[1, 2, 3]
实际上,要复制整个序列,可将两个索引都省略。
>>> numbers[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
更大的步长
执行切片操作时,你显式或隐式地指定起点和终点,但通常省略另一个参数,即步长。在普
通切片中,步长为1。这意味着从一个元素移到下一个元素,因此切片包含起点和终点之间的所
有元素。
>>> numbers[0:10:1]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
在这个示例中,指定了另一个数。你可能猜到了,这显式地指定了步长。如果指定的步长大
于1,将跳过一些元素。例如,步长为2时,将从起点和终点之间每隔一个元素提取一个元素。
>>> numbers[0:10:2]
[1, 3, 5, 7, 9]
numbers[3:6:3]
[4]
显式地指定步长时,也可使用前述简写。例如,要从序列中每隔3个元素提取1个,只需提供
步长4即可。
显式地指定步长时,也可使用前述简写。例如,要从序列中每隔3个元素提取1个,只需提供
步长4即可。
当然,步长不能为0,否则无法向前移动,但可以为负数,即从右向左提取元素。
>>> numbers[8:3:-1]
[9, 8, 7, 6, 5]
>>> numbers[10:0:-2]
[10, 8, 6, 4, 2]
>>> numbers[0:10:-2]
[]
>>> numbers[::-2]
[10, 8, 6, 4, 2]
>>> numbers[5::-2]
[6, 4, 2]
>>> numbers[:5:-2]
[10, 8]
在这种情况下,要正确地提取颇费思量。如你所见,第一个索引依然包含在内,而第二个索
引不包含在内。步长为负数时,第一个索引必须比第二个索引大。可能有点令人迷惑的是,当你
省略起始和结束索引时,Python竟然执行了正确的操作:步长为正数时,它从起点移到终点,而
步长为负数时,它从终点移到起点。
相加
可使用加法运算符来拼接序列。
>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
>>> 'Hello,' + 'world!'
'Hello, world!'
>>> [1, 2, 3] + 'world!'
Traceback (innermost last):
File "<pyshell>", line 1, in ?
[1, 2, 3] + 'world!'
TypeError: can only concatenate list (not "string") to list
从错误消息可知,不能拼接列表和字符串,虽然它们都是序列。一般而言,不能拼接不同类
型的序列。
相乘
将序列与数x相乘时,将重复这个序列x次来创建一个新序列
>>> 'python' * 5
'pythonpythonpythonpythonpython'
>>> [42] * 10
[42, 42, 42, 42, 42, 42, 42, 42, 42, 42]
None、空列表和初始化
空列表是使用不包含任何内容的两个方括号([])表示的。如果要创建一个可包含10个元素
的列表,但没有任何有用的内容,可像前面那样使用[42]*10。但更准确的做法是使用[0]*10,
这将创建一个包含10个零的列表。然而,在有些情况下,你可能想使用表示“什么都没有”的值,
如表示还没有在列表中添加任何内容。在这种情况下,可使用None。在Python中,None表示什么
都没有。因此,要将列表的长度初始化为10,可像下面这样做:
>>> sequence = [None] * 10
>>> sequence
[None, None, None, None, None, None, None, None, None, None]
成员资格检查
要检查特定的值是否包含在序列中,可使用运算符in。这个运算符与前面讨论的运算符(如
乘法或加法运算符)稍有不同。它检查是否满足指定的条件,并返回相应的值:满足时返回True,
不满足时返回False。这样的运算符称为布尔运算符,而前述真值称为布尔值。
>>> permissions = 'rw'
>>> 'w' in permissions
True
>>> 'x' in permissions
False
>>> users = ['mlh', 'foo', 'bar']
>>> input('Enter your user name: ') in users
Enter your user name: mlh
True
>>> subject = '$$$ Get rich now!!! $$$'
>>> '$$$' in subject
True
长度、最小值和最大值
内置函数len、min和max很有用,其中函数len返回序列包含的元素个数,而min和max分别返回序列中最小和最大的元素
>>> numbers = [100, 34, 678]
>>> len(numbers)
3
>>> max(numbers)
678
>>> min(numbers)
>34
>>> max(2, 3)
3
>>> min(9, 3, 2, 5)
2
列表:Python的主力
列表是可变的,另外,列表还有很多特有的方法
函数list
鉴于不能像修改列表那样修改字符串,因此在有些情况下使用字符串来创建列表很有帮助。为此,可使用函数list
>>> list('Hello')
['H', 'e', 'l', 'l', 'o']
请注意,可将任何序列(而不仅仅是字符串)作为list的参数
要将字符列表转换为字符串,可使用下面的表达式:
''.join(somelist)
#其中somelist是要转换的列表
基本的列表操作
给列表元素赋值
使用索引赋值即可
删除元素
使用del语句即可
>>> names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl']
>>> del names[2]
>>> names
['Alice', 'Beth', 'Dee-Dee', 'Earl']
给切片赋值
切片是一项极其强大的功能,而能够给切片赋值让这项功能显得更加强大。
>>> name = list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[2:] = list('ar')
>>> name
['P', 'e', 'a', 'r']
从上述代码可知,可同时给多个元素赋值。你可能认为,这有什么大不了的,分别给每个元
素赋值不是一样的吗?确实如此,但通过使用切片赋值,可将切片替换为长度与其不同的序列。
>>> name = list('Perl')
>>> name[1:] = list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']
使用切片赋值还可在不替换原有元素的情况下插入新元素。
>>> numbers = [1, 5]
>>> numbers[1:1] = [2, 3, 4]
>>> numbers
[1, 2, 3, 4, 5]
在这里,我“替换”了一个空切片,相当于插入了一个序列。你可采取相反的措施来删除
切片。
>>> numbers
[1, 2, 3, 4, 5]
>>> numbers[1:4] = []
>>> numbers
[1, 5]
列表方法
- append
方法append用于将一个对象附加到列表末尾。
>>> lst = [1, 2, 3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]
另外请注意,与其他几个类似的方法一样,append也就地修改列表。这意味着它不会返回修
改后的新列表,而是直接修改旧列表。
- clear
就地清空列表的内容
>>> lst = [1, 2, 3]
>>> lst.clear()
>>> lst
[]
- copy
复制表,常规复制只是将另一个名称关联到列表,而copy会返回一个副本
>>> a = [1,2,3]
>>> b = a
>>> b[1] = 4
>>> a
[1,4,3]
要让a和b指向不同的列表,就必须将b关联到a的副本
>>> a = [1,2,3]
>>> b = a.copy()
>>> b[1] = 4
>>> a
[1,2,3]
这类似于使用a[:]或list(a),他们也都复制a
- count
计算指定的元素在列表中出现了多少次
>>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to')
2
>>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]]
>>> x.count(1)
2
>>> x.count([1, 2])
1
- extend
extend让你能够同时将多个值附加到列表末尾,为此可将这些值组成的序列作为参数提供给方法extend。换而言之,你可使用一个列表来扩展另一个列表
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
这可能看起来类似于拼接,但存在一个重要差别,那就是将修改被扩展的序列(这里是a),即a被修改了,而没有产生副本。 在常规拼接中,情况是返回一个全新的序列。
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]
>>> a
[1, 2, 3]
`
- extend
extend让你能够同时将多个值附加到列表末尾,为此可将这些值组成的序列作为参数提供给方法extend。换而言之,你可使用一个列表来扩展另一个列表
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
这可能看起来类似于拼接,但存在一个重要差别,那就是将修改被扩展的序列(这里是a),即a被修改了,而没有产生副本。 在常规拼接中,情况是返回一个全新的序列。
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]
>>> a
[1, 2, 3]