Python笔记|类型与运算(一)

笔记|类型与运算(一)


一、数字

1.数字常量

Python提供了整数和浮点数。还允许我们使用16进制、8进制、2进制常量来表示,提供了复数类型,还允许整数有无穷的精度。

2.表达操作符

40 + 3.14 自动转换成float类型
4 / 2           #在python3的结果为2.0,而要做整除需要用到//符号

3.数字的显示格式

>>> b / (2.0 + a)
0.800000000000000004
>>> print(b / (2.0 + a))    #在这里交互模式下会比打印的位数多

3.比较:一般的和连续的

>>> 2 == 2.0
True
>>> 2 > 1 < 3
True            #与c/c++不同,python的比较符号可以连续使用

4.传统除法、Floor除法和真除法

X / Y           #在python2.x中是传统除法,即对于整数结果只保留整数部分。在python3中是真除法,无论任何类型都保留小数部分
X // Y          #在python3中是Floor除法,省略小数部分
>>> 1 // (-2)
-1              #这是Floor的特点,去小于结果的最大整数

5.复数

>>> 1j + 2J
3j              #j/J表示虚数单位

6.小数数字

由于浮点数有误差,我们在表示精确的有限小数时,是使用小数对象。

>>> from decimal import Decimal
>>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3')
Decimal('0.0')
>>> 0.1 + 0.1 + 0.1 - 0.3
5.551115123125783e-17

7.分数类型

分数类型可以使用fraction库里面的额Fraction来声明,分数可以保持精度。可以直接使用类型转换来转换成float或int型。

>>> x = Fraction(1,3)
>>> y = Fraction(4, 6)
>>> x
Fraction(1, 3)
>>> y
Fraction(2, 3)
>>> float(y)
0.6666666666666666

8.集合

集合的创建方法:
>>> set([1, 2, 3, 5, 1, 2])
{1, 2, 3, 5}

9.bool型

>>> 1 == True
True
>>> 1 is True
False

二、动态类型简介

1.类型是对象/对象的垃圾收集

  • 变量是一个系统的元素,拥有指向对象的连接空间
  • 对象是一块分配内存
  • 引用是自动形成的从变量到对象的指针
  • 变量不是指针,在改变赋值时会与新对象对应,而对象的类型位于内存头部,旧的对象占用的空间自动回收,称为垃圾收集。
  • 类型只属于对象,不属于变量,所以变量赋值新对象时是行得通的。
  • 在python中每个对象中保持一个计数器,表示引用的变量个数,当个数为零时,内存空间自动回收该对象空间。

Remark:对象可能引用自身,或者引用另一个引用了自身的对象,形成循环引用。这样的引用计数器不会清零,要谨慎对待。

2.共享引用

a = 3
b = a

在这里a和b指向同一个对象3,而当a改变时,对象3没有改变。考虑下面的语句

a = 3
b = a
a = a + 2

在这里对象3是不会发生改变的,实际上整数对象不可改变,而是创建了一个新对象5。

3.共享引用和原处修改

>>> L1 = [1, 2, 3]
>>> L2 = L1
这样L1和L2指向同一个对象,一个改变另一个也改变

>>> L2 = L1[:]
这样就可以指向不同对象了

这种分片技术不会应用在其他核心类型中(字典、集合),复制这样一个类型应该使用X.copy方法调用。

import copy
X = copy.copy(Y)
X = copy.deepcopy(Y)

共享引用和相等

出于完整性考虑,对于前面介绍的垃圾收集,某些类型需要慎重。参照下面语句:
>>> x = 42
>>> x = ‘shrubbery’
在这里42并不是直接回收,而是缓存了,它可能保存在一个系统表中,等待下次使用。但大部分对象都会在非引用状态下直接回收。

>>> L = [1, 2, 3]
>>> M = L
>>> L == M
True
>>> L is M
True

在这里is语句是判断两个变量引用的对象是否相同,而"=="是判断两对象的value是否相等。

字符串

1.字符串常量

python的字符串中没有单个字符的概念,是一种不可变类型。

>>> a = 'aaaa'
>>> a[0] = '1'
Traceback (most recent call last):
File "", line 1, in 
TypeError: 'str' object does not support item assignment
  • 常见字符串常量和表达式

s = ‘’
s.split(’,’)
s.rstrip()
s.rplace(‘aa’, ‘ss’)
s.isdigit()
s.lower()
‘spam’ in s
[s * 2 for s in txt]
s.find(‘sa’)
除了核心系列的操作,python还提供了标准库re模块(正则表达式)支持更高级的基于模式的字符串处理。

2.单双引号是一样的

>>> s = ["hello", 'hello']
>>> s
['hello', 'hello']

python自动在任意的表达式中合并相邻的字符串常量。

>>> s = 'hello' "world"
>>> s
'helloworld'

增加逗号“,”会变成二元组

>>> s = 'hello' ,"world"
>>> s
('hello', 'world')

3.转义序列表示特殊字节

4.raw字符序列抑制转义

myfile = open('C:\new\text.dat', 'w')

在这里\n是换行符,而raw字符串正好解决这个问题。如果字母R/r出现在字符串之前,则关闭转义。

>>> path = r'C:\new\text.dat'
>>> path
'C:\\new\\text.dat'
>>> print(path)
C:\new\text.dat
>>> len(path)
15

在这里每个反斜杠只占用一个位置

5.三重引号编写多行字符串块

>>> s = """oh
... my
... god"""
>>> s
'oh\nmy \ngod'

6.基本操作

>>> print('-' * 10)
----------
>>> print('abc' + 'def')
abcdef   

7.索引和切片

>>> s = 'spam'
>>> s[0], s[-2]
('s', 'a')

在切片s[i:j]中,上界不包括在内。j可以是负数。

>>> s[:-1]
'spa'

扩展分片:第三个限制值

>>> s = 'abcdefghijklmn'
>>> s[:-1:2]
'acegikm'
>>> s[::-1]
'nmlkjihgfedcba'

切片s[i:j:k],k为正整数表示步长,而为负数时表示逆过来。

8.字符串转换工具

python的座右铭之一是拒绝猜的诱惑。在python中不能让数字和字符相加。

>>> '1'+1
Traceback (most recent call last):
File "", line 1, in 
TypeError: must be str, not int

字符串代码转换

>>> ord('s')
115
>>> chr(115)
's'

修改字符串

字符串对象不可改变,但可以通过切片、索引、合并来建立新的对象。

>>> s = 'spam'
>>> s = s + 'SPAM'
>>> s
'spamSPAM'
>>> s = s[:4]+'Burger'+s[4:]
>>> s
'spamBurgerSPAM'

可以通过replace函数来实现

>>> s = 'splot'
>>> s = s.replace('pl', 'pamal')
>>> s
'spamalot'

也可以通过字符格式化表达式来创建新的文本值,结果是一个新的对象值,而不是改变后的对象。

>>> 'That is %d %s bird' % (1, 'dead')
'That is 1 dead bird'
>>> 'That is {0} {1} bird!'.format(1, 'dead')
'That is 1 dead bird!'

9.字符串方法

10.字符串格式化表达式

格式化字符串:

  1. 在%操作符的左侧放置一个需要格式化的字符串,这个字符串带有一个或多个需要转换目标,都以%开头(例如%d)。
  2. 在%操作符右侧放置一个(或多个,嵌入元组中)对象,这些对象会插入到左侧的目标中。
    >>> 'That is %d %s bird' % (1, 'dead')
    'That is 1 dead bird'

更高级的字符串格式化表达式

转换目标的通用结构:

%[(name)][flags][width][.precision]typecode

操作:放置字典的键;罗列出左对齐(-)、正负号(+)和补零(0)的标志位;给出数字的整体长度和小数点后的位数等。width和precision都可以编码为一个*,以指定它们应该从输入值的下一项中取值。

基于字典的字符串格式化

>>> "%(n)d %(x)s" % {"n":1, "x":'spam'}
'1 spam'

11.字符串格式化调用方法

format方法使用主体字符串作为模板,花括号通过位置或关键字指出要替换的目标及插入的参数。

>>> template = '{0}, {1} and {2}'
>>> template.format('spam', 'ham', 'eggs')
'spam, ham and eggs'

字符串也可以临时的常量。

你可能感兴趣的:(Python)