1、变量和数据类型
1.1变量
1.每个变量都存储了一个值——与变量相关联的信息。
2.变量不仅可以为整数或浮点数,还可以是字符串,可以是任意数据类型。
1.1.1变量的命名和使用
变量名只能包含字母、数字和下划线,且数字不能打头。变量名不能包含空格,但可以使用下划线间隔。不能把python关键字和函数名作为变量名。变量名应既简短又具有描述性。慎用小写字母l和大写字母O,容易和1,0混淆。
1.1.2使用变量时避免命名错误
出现错误时解释器会提供一个traceback(回溯)。Traceback是一条记录,指出了什么地方出现错误,显示错误提示。
1.2字符串str
1.字符串就是一系列字符。是一种数据类型,在Python中用引号括起的都是字符串,可单引号也可双引号。
2.Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。把Unicode编码转化为“可变长编码”的UTF-8编码。
3.Python对bytes类型的数据用带b前缀的单引号或双引号表示:x = b'ABC'。以Unicode表示的str通过encode()方法可以编码为指定的bytes。
>>> 'ABC'.encode('ascii')b'ABC'
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:
>>> b'ABC'.decode('ascii')'ABC'
4. 对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:
>>> ord('A')65>>> ord('中')20013>>> chr(66)'B'>>> chr(25991)'文'
5.要计算str包含多少个字符,可以用len()函数,len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数。可见,1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。
6.当num<0时,bin(num + 2**32),转化为16位的二进制。也可以用bin(num & 0xffffffff)转化为16位的二进制,两种方法效果是一样的。
7.二进制表示法:前缀为0b的字符串,'0b1110',用bin()把数字转换为二进制。>>> bin(14) 表示为'0b1110'
8.16进制表示法:前缀为0x的字符串,'0xe'用hex()把数字转换为16进制。>>> hex(14) 表示为 '0xe'
9.32进制表示法:前缀为0o的字符串,'0o16',用Oct把数字转换为32进制。>>> oct(14) 表示为 '0o16'
10.使用int( )可以把其他进制转换为10进制.
>>> int('1001', 2)9>>> int('2333', 16)9011
1.2.1对字符串的操作
- title() 以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写。
- upper() 将字符串改为全部大写。lower()将字符串改为全部小写。
- capitalize() 将字符串的第一个字符转换为大写。
- 如果字符串至少有一个字母,并且所有字母都是大写或小写,isupper()和 islower()方法就会相应地返回布尔值 True。否则,该方法返回 False。
- salpha() 返回 True,如果字符串只包含字母,并且非空;
- isalnum() 返回 True,如果字符串只包含字母和数字,并且非空;
- sdecimal() 返回 True,如果字符串只包含数字字符,并且非空;
- sspace() 返回 True,如果字符串只包含空格、制表符和换行,并且非空;
- istitle() 返回 True,如果字符串仅包含以大写字母开头、后面都是小写字母的单词。
- startswith()和 endswith()方法返回 True,如果它们所调用的字符串以该方法传入的字符串开始或结束。否则,方法返回 False。
- count() 返回str在字符串中出现的次数。可以指定范围,添加参数beg 或者 end。
- join()方法在一个字符串上调用,参数是一个字符串列表,返回一个字符串。
-
>>> ', '.join(['cats', 'rats', 'bats'])'cats, rats, bats'>>> ' '.join(['My', 'name', 'is', 'Simon'])'My name is Simon' >>> 'ABC'.join(['My', 'name', 'is', 'Simon'])'MyABCnameABCisABCSimon'
- split()方法做的事情正好相反:它针对一个字符串调用,返回一个字符串列表。也可以向split()方法传入一 个分割字符串,指定它按照不同的字符串分割。
>>> 'My name is Simon'.split()['My', 'name', 'is', 'Simon']
- rjust()和 ljust()字符串方法返回调用它们的字符串的填充版本,通过插入空格来对齐文本。这两个方法的第一个参数是一个整数长度,用于对齐字符串。rjust()和 ljust()方法的第二个可选参数将指定一个填充字符,取代空格字符。
>>> 'Hello'.rjust(20, '*')'***************Hello' >>> 'Hello'.ljust(20, '-')'Hello---------------'
- center()字符串方法与 ljust()与 rjust()类似,但它让文本居中,而不是左对齐或右对齐。
- sort()将字符串排序。
- 注意,Python对大小写很敏感,如果写错了大小写,程序会报错。
- 合并——Python使用加号+来合并字符串。
- 删除空白:方法rstrip()右, lstrip()左, strip()两边,strip()也可以带参数,删除指定内容。
- 语法错误:在用单引号括起的字符串中,如果包含撇号,就将导致错误。双引号不会。
- Print() 打印,添加逗号会空一格。
- pyperclip 模块有 copy()和 paste()函数,可以向计算机的剪贴板发送文本,或从它接收文本。
- 字符串有个replace()方法,可以替换指定内容。
>>> a = 'abc'>>> a.replace('a', 'A')'Abc'
1.2.2空值
空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。
1.2.3常量
常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量:PI = 3.14159265359。
1.2.4赋值
在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量:
>>>a = 123 # a是整数>>>print(a)123>>>a = 'ABC' # a变为字符串>>>print(a) 'ABC'
赋值语句:a, b = b, a + b,这种赋值非常方便。用这种赋值可以很轻松的构造斐波那契数列:
1 fib = [0, 1] # 构造fib数列2 a, b = 0, 13 while b < 1000:4 a, b = b, a + b5 fib.append(b)6 7 print(fib)8 9 输出:[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597]
1.2.5格式化
Python中格式化有两种,第一种用%实现,第二种{ } format格式。
% 运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。常用占位符:
- %d 整数
- %f 浮点数
- %s 字符串
- %x 十六进制整数
其中,格式化整数和浮点数还可以指定是否补0和整数与小数的位数:
>>> '%2d-%02d' % (3, 1)' 3-01'>>> '%.2f' % 3.1415926'3.14'
如果你不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串。有些时候,字符串里面的%是一个普通字符,需要转义,用%%来表示一个 % 。
第二种格式化方法,format,通过 {} 来代替 % 。
1、正常使用
>>> print("我叫{},今年{}岁了".format("小李", 20))我叫小李,今年20岁了
2、还可以通过在括号里填写数字,修改格式化的顺序,0为第一个参数,1为第二个参数。
>>> print("我叫{1},今年{0}岁了".format("小李", 20))我叫20,今年小李岁了
3、通过key取变量,通过设定关键字,可以在 { }中直接指定关键字,不用管format中参数的顺序。
>>> print("我叫{name},今年{age}岁了".format(name="小李", age=20))我叫小李,今年20岁了
1.2.6转义字符
- 空白——泛指任何非打印字符,如空格、制表符和换行符。
- 转义字符\可以转义很多字符 \t 制表符 ,\n 换行符。
- 字符\本身也要转义,所以\\表示的字符就是\ 。
- 如果字符串里面有很多字符都需要转义,Python中可以用 r''表示'' 内部的字符串默认不转义(原始字符串):
>>> print('\\\t\\')\ \>>> print(r'\\\t\\')\\\t\\>>> print(r'That is Carol\'s cat.')That is Carol\'s cat.
1.3数字
1.3.1整数 int
- 计算机由于使用二进制,所以,有时候用十六进制表示整数比较方便,十六进制用0x前缀和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等。
- 整数的除法是精确的。在Python中,有两种除法,一种除法是/ , /除法计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数。还有一种除法是//,称为地板除,两个整数的除法仍然是整数。
- % 取余数。
- ** 表示次方,例如 a**b,即 a 的 b 次方。
- pow(x, y)函数,计算x的y次方,例如:pow(2, 10) = 1024,pow(2, 15) = 32768 。
1.3.2浮点数float
- Python将带小数的数字都称为浮点数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是完全相等的。
- 对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等。
- 浮点数精确到小数后15位。
1.3.3复数complex
1.使用complex()把数字转化为复数。 complex(2) ---> (2+0j)
2.对于复数 z = 7 + 5j ,可以用z.real得到实数部分,z.imag得到虚数部分。
3.复数的虚数部分通过加 j 或 J 来标识。
1.3.4使用函数str()避免错误
- 使用 type() 可以坚持数据类型,不过 type() 不能对class类的子集进行检查。
- 数据类型检查也可以用内置函数isinstance()实现,isinstance就可以对class类的子集进行检查,所有要看情况自己判断选择使用哪一个:
1 def my_abs(x):2 if not isinstance(x, (int, float)):3 raise TypeError('bad operand type')4 if x >= 0:5 return x6 else:7 return -x
1.4注释
1. 以#开头的语句是注释,注释是给人看的,可以是任意内容,解释器会忽略掉注释。其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块。
1 # 这是个注释
2.由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
1 #!/usr/bin/env python32 # -*- coding: utf-8 -*-
3.文档字符串的注释 , 用3对双引号表示,一般用于对函数或类的说明, ””” ”””
1.5Python之禅
在命令行中输入import this打印出python之禅
The Zen of Python, by Tim Peters
- Beautiful is better than ugly.
- Explicit is better than implicit.
- Simple is better than complex.
- Complex is better than complicated.
- Flat is better than nested.
- Sparse is better than dense.
- Readability counts.
- Special cases aren't special enough to break the rules.
- Although practicality beats purity.
- Errors should never pass silently.
- Unless explicitly silenced.
- In the face of ambiguity, refuse the temptation to guess.
- There should be one-- and preferably only one --obvious way to do it.
- Although that way may not be obvious at first unless you're Dutch.
- Now is better than never.
- Although never is often better than *right* now.
- If the implementation is hard to explain, it's a bad idea.
- If the implementation is easy to explain, it may be a good idea.
- Namespaces are one honking great idea -- let's do more of those!