Python3 字符串+除法+逻辑运算符+身份运算符+_+round()
初学python,发现了一些有意思的地方,记录一波,一些错误地方也希望得到大佬指导。
参考: link.
String 字符串
Python中的字符串用单引号 ’ 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符。如果你不想让反斜杠发生转义,可以在字符串前面添加一个r,表示原始字符串:
>>> print('One Two Three\nFour Five Six')
One Two Three
Four Five Six
>>> print(r'One Two Three\nFour Five Six')
One Two Three\nFour Five Six
Python 没有单独的字符类型,一个字符就是长度为1的字符串。
与 C 字符串不同的是,Python 字符串不能被改变。向一个索引位置赋值会导致错误。但可以重新赋值。
>>> string1 = 'I love you'
>>> string1[4]
'v'
>>> string1[4] = 'a'
Traceback (most recent call last):
File "<pyshell#111>", line 1, in <module>
string1[4] = 'a'
TypeError: 'str' object does not support item assignment
>>> string1 = 'abcde'
>>> string1
'abcde'
字符串可以用+运算符连接在一起,用*运算符重复。
>>> string1 = 'abcde'
>>> string1*2
'abcdeabcde'
>>> string2 = 'fghijk'
>>> string1+string2
'abcdefghijk'
字符串截取的语法格式如下:
变量[头下标:尾下标:步长]
索引值以 0 为开始值,-1 为从末尾的开始位置。截到尾下标前一个。遵循左闭右开原则
如果头下标和尾下标均不填写,默认取全部字符
如果头下标填写,尾下标不填写(或填写的值大于指针下标),默认从头下标开始截取,至字符串最后一个位置
如果头下标不填写, 尾下标填写,默认从0位置开始截取,至b的前一个位置
如果头下标为负数,默认从尾部某一位置,开始向后截取
如果头下标>= 尾下标, 默认输出为空。
>>> s1 = 'abcdefg'
>>> s1[0:-1]
'abcdef'
>>> s1[0]
'a'
>>> s1[0:]
'abcdefg'
>>> s1[2:5]
'cde'
>>> s1[2:]
'cdefg'
>>> s1[1::3]
'be'
>>> s1[:-2]
'abcde'
>>> s1[-3:]
'efg'
>>> s1[5:3]
''
如果第三个参数为负数表示逆向读取,以下实例用于翻转字符串(结合List):
>>> input = 'I like runoob'
"""
通过空格将字符串分隔符,把各个单词分隔为列表
string.split(str,num)
str——分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
num——分割次数。默认为 -1, 即分隔所有。
"""
>>> inputWords = input.split(" ")
>>> inputWords #此时字符串变为了List,List和字符串一样,同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表
['I', 'like', 'runoob']
>>> inputWords = inputWords[-1::-1]
"""
第一个参数 -1 表示最后一个元素
第二个参数为空,表示移动到列表末尾
第三个参数为步长,-1 表示逆向
"""
>>> inputWords
['runoob', 'like', 'I']
"""
重新组合字符串
join()方法将序列中的元素以指定的字符(下面是以' '空格)连接生成一个新的字符串
inputWords是要连接的元素序列
"""
>>> output = ' '.join(inputWords)
>>> output
'runoob like I'
除法
数值的除法包含两个运算符:/ 返回一个浮点数,// 返回一个整数。
在整数除法中,除法 / 总是返回一个浮点数。
//得到的并不一定是整数类型的数,它与分母分子的数据类型有关系。
>>> 2 / 4
0.5
>>> 2 // 4
0
>>> -9//2
-5
>>> -9//2.0
-5.0
逻辑运算符
x and y #如果x为False,返回x的值,否则返回y的计算值
x or y #如果x是True,返回x的值,否则返回y的计算值
python中的and从左到右计算表达式,若所有值均为真,则返回最后一个值,若存在假,返回第一个假值;
or也是从左到有计算表达式,返回第一个为真的值;
>>> x = 10
>>> y = 20
>>> x and y
20
>>> x or y
10
>>> x = 0
>>> x and y
0
>>> x or y
20
身份运算符
is/is not #判断两个标识符是不是引用自一个或不同对象。
id()函数可用于获取对象内存地址。
>>> a = 100
>>> b = 100
>>> a == b
True
>>> id(a)
1635075839440
>>> id(b)
1635075839440
>>> a is b
True
>>> a = 1000
>>> b = 1000
>>> a == b
True
>>> id(a)
1635114708880
>>> id(b)
1635115793136
>>> a is b
False
可以发现a和b取值不同时进行同样的操作得到的结果不一样。这是因为Python对小的整数做了处理,在交互式环境中,编译器会有一个小整数池的概念,会把(-5,256)间的数预先创建好,而当a和b超过这个范围的时候,两个变量就会指向不同的对象了,因此地址也会不一样。
>>>a = [1,2,3]
>>>b = a
>>>a is b
True
>>>b = a[0:]
>>>b
[1,2,3]
>>>a is b
False
>>>b == a
True
这也是有意思的关于List的一个现象,但原理我还没有查到…姑且认为第一个是直接把a赋值给b,所以指向的地址相同,第二个是给b单独赋a的值,b就重新开辟了一个空间保存值。
_
在交互模式中,最后被输出的表达式结果被赋值给变量 _ 。例如:
>>> a = 10
>>> b = 20
>>> a + b
30
>>> _
30
>>> _+a
40
>>> _
40
此处, _ 变量应被用户视为只读变量
实际情况是你也可以对于_ 赋值,_=10 是没有毛病的,但这样的结果会导致你在之后调用 _ 的时候全部变成了10,除非你 del _(可以使用del语句删除一些对象引用)
>>> _ = 10
>>> a = 10
>>> b = 20
>>> a+b
30
>>> _
10
>>> del _
>>> a+b
30
>>> _
30
round()
round(x [,n]) #返回浮点数 x 的四舍五入值,如给出n值,则代表舍入到小数点后的位数(默认是整数)
>>> a = 10.123
>>> round(a)
10
>>> round(a,2)
10.12
>>> round(10.5)
10
>>> round(9.5)
10
>>> round(8.5)
8
>>> round(7.5)
8
>>> round(1001.5)
1002
>>> round(1000.5)
1000
>>> round(10.255,2)
10.26
>>> round(10.155,2)
10.15
>>> round(9.255,2)
9.26
>>> round(9.155,2)
9.15
可以发现,round()有时对5舍有时又对5进。Why?
从统计学的角度上来讲,如果大量数据无脑的采用四舍五入会造成统计结果偏大。而"奇进偶舍"可以将舍入误差降到最低,和浮点数存储也有关系。
按我目前发现的规律,保留整数就看整数的奇偶性,奇数对5进位,偶数对5舍,对于小数,看保留前一位的奇偶性。
感觉还是尽量避免使用比较好。
链接: link.这里底部的笔记讨论区有人解释。