纸上得来终觉浅,绝知此事要躬行。
1. 字符串
字符串是Python
中最常用的数据类型,访问子字符串,可以使用方括号来截取字符串。同时,也可以通过等号进行赋值操作。如下所示,我们可以内置函数dir
方法得到其对应的属性和方法。
>>> dir('')
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__',
'__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize',
'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find',
'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit',
'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle',
'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip',
'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate',
'upper', 'zfill']
- 基本使用
In [1]: 'Hello, World!'
Out[1]: 'Hello, World!'
In [2]: 'Hello,' + ' World!'
Out[2]: 'Hello, World!'
In [3]: """
...: This
...: is
...: a
...: Test
...: """
Out[3]: '\nThis\nis\na\nTest\n'
In [4]: print('\nThis\nis\na\nTest\n')
This
is
a
Test
- 开头或结尾
startswith
endswith
In [5]: 'this'.startswith('t')
Out[5]: True
In [6]: 'this'.endswith('t')
Out[6]: False
In [7]: 'this'.startswith('t', 1, 3)
Out[7]: False
- 大小写转换
upper
lower
swapcase
title
capitalize
In [8]: 'abc'.upper()
Out[8]: 'ABC'
In [9]: 'ABC'.lower()
Out[9]: 'abc'
In [10]: 'Abc'.swapcase()
Out[10]: 'aBC'
In [11]: 'abc'.title()
Out[11]: 'Abc'
In [12]: 'abc'.capitalize()
Out[12]: 'Abc'
- 切分或分割
split
rsplit
In [13]: 'a b c d'.split()
Out[13]: ['a', 'b', 'c', 'd']
In [14]: 'a b c d'.split(None, 2)
Out[14]: ['a', 'b', 'c d']
In [15]: 'a,b,c,d'.split(',')
Out[15]: ['a', 'b', 'c', 'd']
In [16]: 'a,b,c,d'.split(',', 2)
Out[16]: ['a', 'b', 'c,d']
In [17]: 'a,b,c,d'.split()
Out[17]: ['a,b,c,d']
In [18]: 'a b c d'.rsplit(None, 1)
Out[18]: ['a b c', 'd']
- 移除首尾特殊字符
strip
lstrip
rstrip
In [19]: ' abc '.strip()
Out[19]: 'abc'
In [20]: ' abc\n'.strip()
Out[20]: 'abc'
In [21]: ' abc '.lstrip()
Out[21]: 'abc '
In [22]: ' abc '.rstrip()
Out[22]: ' abc'
In [23]: '#abc#'.strip('#')
Out[23]: 'abc'
- 替换
replace
In [24]: 'aabbcc'.replace('a', 'd')
Out[24]: 'ddbbcc'
In [25]: 'aabbcc'.replace('a', 'd', 1)
Out[25]: 'dabbcc'
In [26]: 'abc'.replace('a', 'd').replace('d', 'e')
Out[26]: 'ebc'
- 分区
partition
rpartition
In [27]: 'a/b/c'.partition('/')
Out[27]: ('a', '/', 'b/c')
In [28]: 'a/b/c'.rpartition('/')
Out[28]: ('a/b', '/', 'c')
In [29]: schame, _, url = 'http://www.baidu.com'.partition('://')
In [30]: schame
Out[30]: 'http'
In [31]: url
Out[31]: 'www.baidu.com'
- 连接
join
# 不要使用'+'来连接字符串
In [32]: ' '.join([ 'I', 'love', 'python' ])
Out[32]: 'I love python'
- 填充
center
ljust
rjust
zfill
In [33]: 'abc'.center(20)
Out[33]: ' abc '
In [34]: 'abc'.center(20, '#')
Out[34]: '########abc#########'
In [35]: 'abc'.ljust(20)
Out[35]: 'abc '
In [36]: 'abc'.rjust(20)
Out[36]: ' abc'
In [37]: 'abc'.zfill(20)
Out[37]: '00000000000000000abc'
2. 格式化
In [1]: 'I love %s' % ('python')
Out[1]: 'I love python'
In [2]: 'I love %s' % ('python',)
Out[2]: 'I love python'
In [3]: 'I love %(name)s' % { 'name':'python' }
Out[3]: 'I love python'
In [4]: 'I love %(name)s, %(name)s is my first languages' % { 'name':'python' }
Out[4]: 'I love python, python is my first languages'
In [5]: 'I love %s, %s is my first langeages' % ('python','python')
Out[5]: 'I love python, python is my first langeages'
In [6]: '%d is a number' % 4
Out[6]: '4 is a number'
In [7]: '%E' % 0.0000000000001
Out[7]: '1.000000E-13'
In [8]: '%10d' % 1
Out[8]: ' 1'
In [9]: '%010d' % 1
Out[9]: '0000000001'
In [10]: ' New list is %s' % (new_list,)
Out[10]: ' New list is [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
- format
# 使用方式
[[fill]align][sign][#][0][minimumwidth][.precision][type]
# PEP3101中说明format是为了替代%这种字符串格式方法的
In [1]: 'I am {}'.format('escape')
Out[1]: 'I am escape'
In [2]: 'I am {}, age is {}'.format('escape',18)
Out[2]: 'I am escape, age is 18'
In [3]: 'I am {1}, age is {0}'.format(18, 'escape')
Out[3]: 'I am escape, age is 18'
In [4]: '{name}, age is {age}'.format(name='escape', age=18)
Out[4]: 'escape, age is 18'
In [5]: '{name}, name is {name}'.format(name='escape')
Out[5]: 'escape, name is escape'
In [6]: '{0}, name is {0}'.format('escape')
Out[6]: 'escape, name is escape'
# 使用内置数据类型的参数
In [7]: 'My {config[spam]} runs {sys.platform}'.format(sys=sys, config = {'spam': 'laptop'})
Out[7]: 'My laptop runs darwin'
# 使用函数中的方法
In [8]: "Today is: {0:%a %b %d %H:%M:%S %Y}".format(datetime.now())
Out[8]: 'Today is: Tue Jun 19 16:00:49 2018'
In [8]: "My name is {0.name}".format(open('out.txt', 'w'))
Out[8]: My name is out.txt
# !r表示repr()、!s表示str()
In [9]: "{0!r:20}".format("Hello")
Out[9]: "'Hello' "
In [10]: "{0!s:20}".format("Hello")
Out[10]: 'Hello '
# 用户可以自定义字符串格式化方式
class NamespaceFormatter(Formatter):
def __init__(self, namespace={}):
Formatter.__init__(self)
self.namespace = namespace
def get_value(self, key, args, kwds):
if isinstance(key, str):
try:
# Check explicitly passed arguments first
return kwds[key]
except KeyError:
return self.namespace[key]
else:
Formatter.get_value(key, args, kwds)
- f 字符串
# 使用方式
f ' <text> { <expression> <optional !s, !r, or !a> <optional : format specifier> } <text> ... '
# 提供一种简明、可读的字符串格式化方法
In [1]: name = 'escape'
In [2]: f'He said his name is {name}.'
Out[2]: 'He said his name is escape.'
In [3]: value = decimal.Decimal('12.34567')
In [4]: f'result: {value:10.4}'
Out[4]: 'result: 12.35'
In [5]: import datetime
In [6]: anniversary = datetime.date(2018, 10, 11)
In [7]: f'my anniversary is {anniversary:%A, %B %d, %Y}.'
Out[7]: 'my anniversary is Thursday, October 11, 2018.'
3. 数值
- 整数(int)
In [1]: 1 + 2
Out[1]: 3
In [2]: 2 - 1
Out[2]: 1
In [3]: 2 * 3
Out[3]: 6
In [4]: 2 / 3
Out[4]: 0.6666666666666666
In [5]: 3 / 2
Out[5]: 1.5
In [6]: 2 ** 3
Out[6]: 8
In [7]: 3 % 2
Out[7]: 1
- 整数(float)
# 因为底层CPU和ieee754标准,导致不能精确的显示十进制数值
In [8]: 1.1 + 0.1
Out[8]: 1.2000000000000002
In [9]: 1.1 + 0.2
Out[9]: 1.3
In [10]: 1.1 / 0.2
Out[10]: 5.5
In [11]: 1.1 - 0.1
Out[11]: 1.0
In [12]: 1.1 - 0.2
Out[12]: 0.9000000000000001
In [13]: 1.1 * 0.1
Out[13]: 0.11000000000000001
# 精确计算可以使用Decimal模块
# 在Python3中是内置的,但在Python2中需要额外引入
In [14]: from decimal import Decimal
In [15]: Decimal('1.1') + Decimal('0.1')
Out[15]: Decimal('1.2')
In [16]: Decimal('1.1') * Decimal('0.1')
Out[16]: Decimal('0.11')
- 布尔值(bool)
常见布尔值为 Flase 的值 | 说明 |
---|---|
None |
空值 |
False |
布尔值 |
0 |
整数 |
0.0 |
浮点数 |
'' |
空字符串 |
[] |
空列表 |
() |
空元组 |
{} |
空字典 |
- 类型转换
In [17]: str(1)
Out[17]: '1'
In [18]: int('1')
Out[18]: 1
In [19]: float('1')
Out[19]: 1.0
In [20]: float(1)
Out[20]: 1.0
4. 常见问题
- 除法运算
# Python3中的除法运算
In [22]: 2 / 3
Out[22]: 0.6666666666666666
In [23]: 3 / 2
Out[23]: 1.5
# Python2中的除法运算
>>> 2 / 3
0
>>> 3 / 2
1
# 【方法一】通过转换类型解决
>>> float(3) / 2
1.5
>>> float(2) / 3
0.6666666666666666
# 【方法二】引入新除法运算
>>> from __future__ import division
>>> 3 / 2
1.5
>>> 2 / 3
0.6666666666666666
- 精确求值
# 精确计算可以使用Decimal模块
# 在Python3中是内置的,但在Python2中需要额外引入
In [14]: from decimal import Decimal
In [15]: Decimal('1.1') + Decimal('0.1')
Out[15]: Decimal('1.2')
In [16]: Decimal('1.1') * Decimal('0.1')
Out[16]: Decimal('0.11')