Python - 型态转换及字串基础

今天我们要来谈一下型态转换及一些字串的操作

bool, int, float, str,
也许读者有想到一个问题:
两个不一样的型态是怎么互相转换的呢?
比方说我们先前在除法的时候,两个int相除,
是会产生float的(如果不使用整数除法),
这个就是Python在这当中自动进行了型态转换的部分。
有些时候,型态转换则需要我们自己来操作,
比如int和float的互转,只需要使用int()或float()即可。
我们来看一下int和float转换的范例:

>>> float(1) # 从没有小数点的int变成带小数点的float
1.0
>>> int(1.0) # 很直观XD
1
>>> int(1.6) # 咦? 不是2吗?
1
>>> int(1.4)
1
>>> int(-1.1)
-1
>>> int(-2.1) # 所以是无条件舍弃
-2
>>> 1.5+1 # float和int相加
2.5
>>> 1+3.0  # 顺序不影响
4.0

int转换成float以后,就是多加.0在后面就对了!
float转换成int的话,则是将小数点后面的东西全数舍弃。
四则运算的话,int和float相遇最后结果会变成float,以求保留较多的资料。

那bool和int之间的关系呢? 0会被当成伪,1会被当成真,
但是其他的数字(0以外的所有数字)也会被当成真呦!

>>> bool(0)
False
>>> bool(1)
True
>>> bool(3)
True
>>> bool(-2)
True
>>> int(True)
1
>>> int(False)
0

int还有其他变化,
可以将其转换成用二进位/八进位/十六进位来表达。
所谓的二进位就是每个位数只有0或1两种数字,
超过就进一位。

举例来说,十进位的7等于二进位的111,
因为111等于1 * 2^2 + 1 * 2^1 + 1 * 2^0 = 4+2+1=7
(看不懂这段的,可以搜寻一下二进位,这边不再赘述)
我们一般用X进位来表达数字时,称这个X为「基数」。

在Python中如果数字用10以外的基数来表达时,
会额外做显示上的处理:
二进位-> 0b或0B (b代表binary)
八进位-> 0o或0O (o代表octal)
十六进位- > 0x或0X (x代表hexadecimal)
举例来说:

>>> 0b10  # 2
2
>>> 0b111 # 4+2+1=7
7
>>> 0o11  # 8+1=9
9
>>> 0x1F  # 16+15=31 (A~F分別代表16進位的10~15)
31

上面这些有点枯燥我明白,但请记下来,有些东西将来会用上的XD

再来谈谈字串(str)吧!
在Python中,一个字串的资料,是用两个单引号或两个双引号括起来的,
当int, float, bool等型态要转为str时,
Python只有做一件事情:把它们加进引号中。 (真是偷懒XD)

>>> str(9)
'9'
>>> str(97.1)
'97.1'
>>> str(True)
'True'
>>> str(0o11) # 以其他基数表达的int,仍会先转回10进位再处理
'9'

那反方向呢?

>>> int('9')
9
>>> int('9.1') # python会跳出错误说:你骗我,它不是int!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '9.1'
>>> float('9.1') # 这样总符合了吧!
9.1
>>> bool('3') # 因为是0以外的东西,所以会是True
True

讲到这里,读者可能会有疑问:
「前面讲过print可以将东西印出来,
那我如果要印出字串,但里面含单引号或双引号呢?」
问的好!
由于有些特殊字元如单引号,双引号等会有被拿去用的困扰,
所以当遇到会有特殊含义的字元,
或者要将特定字元转换用途时,我们可以使用一个反斜线( \),
将原先的含义给转换。
这边请留意一下,在一般大多数的程式语言来说,
印出(print)通常代表把一些内容,输出到萤幕上,
可能是程式的命令提示字元,或者别的东西,
但不是印表机! ! !

比如我们想印出'We will rock you!' (连同单引号),
那么,我们可以这样子:

>>> print('\'We will rock you!\'') # 外层的单引号仍然是用来表达字串的开头跟结尾,但内层的单引号被转义回一般无特殊含义的单引号
'We will rock you!'

其他还有一些常用的转义字元,但最常用的就是"\n"了,
可以用来做换行的效果!
举例来说

>>> print('天青色等烟雨 而我在等你\n炊烟袅袅升起 隔江千万里')
天青色等烟雨 而我在等你
炊烟袅袅升起 隔江千万里

你要多换几行?那就多打几个\n吧!
想同时印出多个字串的话,可以用逗号来连接,Python会帮忙在中间加空格。

>>> print('I\n','feel','good') # 即便换行,feel前面还是有一格空格
I
 feel good

再来谈谈Python中字串的一些常见的操作:
+结合、*复制、[]取字元、[start:end:step]切片、len()取长、split()分割、join()结合
以下是范例:

>>> 'a'+'b'+'c' # 相加就是串在一起就对了!
'abc'
>>> 'apple'*2   # 乘上的正整数相当于重复的次数
'appleapple'
>>> a = 'apple'
>>> a[3]        # 取第3位(从0起算)
'l'
>>> a[0:4:1]    # 切片slice: 从0开始,到4结束,每次跳1单位
'appl'
>>> a[0:4:2]    # 切片slice: 从0开始,到4结束,每次跳2单位
'ap'
>>> len(a)      # 取长度
5
>>> len(a[0:4:1]) # 刚刚切出的长度是4
4
>>> b = 'An apple a day, keeps the doctor away.'
>>> b.split() # 用括号内的字串来分割,预设是空白字元(换行/空格/位移tab)
['An', 'apple', 'a', 'day,', 'keeps', 'the', 'doctor', 'away.']
>>> b.split(',') # 用逗号来分割(留意用来分割的东西会不见)
['An apple a day', ' keeps the doctor away.']
>>> b.split('.') # 因为.的右边没东西,所以会多一个空字串
['An apple a day, keeps the doctor away', '']
>>> c = b.split()
>>> c
['An', 'apple', 'a', 'day,', 'keeps', 'the', 'doctor', 'away.']
>>> d = '\n'.join(c) # '字串'.join(要被接起来的串列)
>>> d
'An\napple\na\nday,\nkeeps\nthe\ndoctor\naway.'
>>> print(d) # 印出来的时候就知道\n是拿来换行了!
An
apple
a
day,
keeps
the
doctor
away.

程式码内的注解应该足够清楚,除了有几点需要补充说明。
首先留意到a[3],在单独中括号加上单一数字时,
代表从头开始数到索引值(index)为3的地方,取出那个字元。
注意欧!这个算法中是从0开始数的!
也就是'apple'中的'a'是a[0],请读者务必记得从0开始!

接着看到**[start:end:step]的切片部分,
它代表着我们可以用定好的规则来取出字串的片段。
其中:
start表示开始的位置;
end表示结束的位置,但是不含end这个位置;
step代表每次移动多少单位。

比方说刚刚的a[0:4:1],
就是从0开始,到4结束,每次移动1单位,但因为不包含4,
所以只会取到'appl'。
在step为正的情况下,start不写的话,预设代表从0开始,
而step不写的话,预设代表每次移动1单位

所以
a[0:4:1]也可以写成a[: 4:1]或者a[:4] ,读者可以尝试看看。
同理,end不写的话代表预设到结束(包含尾端),
所以如
a[1:]就会是'pple'**。

此外,slice还有特异功能:当step是负数的时候,
前面不写则代表预设从字串尾往字串头走,
所以如a[::-1]会是'elppa',相当于将a反转
a[4:1:-1]则是'elp'

而当start或end是负数的时候,
Python会将负数视作从尾往头起算,如-1代表倒数第1个字元。
例如a[-2:0:-1]会是'lpp'

最后留意到split()作用过后,
会产生一个用中括号框起来,及逗号分隔的东西,
我们将其称为list(串列,或称列表),在接下来的文章中我们会介绍到它,
现在只需要知道,它就是一连串列出来的东西即可:
split会按照分割的字串将目标字串给切分开成列表;
join则会使用给定的字串将一个列表的所有东西按顺序连接起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值