#
开头;:
结尾时,缩进的语句视为代码块;1
,100
,-8080
,0
,等等;0x
前缀和0-9,a-f表示,例如:0xff00
,0xa5b4c3d2
,等等;1.23
,3.14
,-9.01
,等等;1.23e9
或者12.3e8
,0.000012可以写成1.2e-5
,等等;'
或双引号"
括起来的任意文本,比如'abc'
,"xyz"
等等;'
本身也是一个字符,那就可以用""
括起来,比如"I'm OK"
包含的字符是I
,'
,m
,空格,O
,K
这6个字符;\
来标识字符串内部包含的'
和"
;比如:'I\'m \"OK\"!'
表示的内容就是:
I'm "OK"!
\n
表示换行,\t
表示制表符,\\
表示的就是字符\
;r''
表示''
内部的字符串默认不转义,如:>>> print('\\\t\\')
\ \
>>> print(r'\\\t\\')
\\\t\\
'''...'''
的格式表示多行内容,此处注意...
是提示符,不是代码的一部分;>>> print('''line1
... line2
... line3''')
line1
line2
line3
True
、False
两种值,在Python中,可以直接用True
、False
表示布尔值(请注意大小写);>>> True
True
>>> False
False
>>> 3 > 2
True
>>> 3 > 5
False
and
、or
和not
运算;if age >= 18:
print('adult')
else:
print('teenager')
None
表示。None
不能理解为0
,因为0
是有意义的,而None
是一个特殊的空值;_
的组合,且不能用数字开头;=
是赋值语句,可以把任意数据类型赋值给变量;同时不要将赋值语句的等号等同于数学中的等号;int a = 123; // a是整数类型变量
a = "ABC"; // 错误:不能把字符串赋给整型变量
PI
不会被改变,所以全部大写的变量名只是一个习惯的用法;/
除法计算结果是浮点数;除法计算结果是浮点数,即使是两个整数恰好整除,如:>>> 10 / 3
3.3333333333333335
>>> 9 / 3
3.0
//
地板除,如:>>> 10 // 3
3
%
取余,如:>>> 10 % 3
1
8个比特(bit)作为一个字节(byte),一个字节能表示的最大整数就是255(二进制11111111=十进制255),最初只有127个字符被编码到计算机中,即ASCII
编码;
显然中文以及其他国家的语言,一个字节是不够的,故Unicode
编码应用而生,最常用的是用两个字节表示一个字符(如果非常偏僻的字符,需要4个字节);
虽然统一成Unicode编码,乱码问题消除了,但如果写的文本全都是英文的话,用Unicode编码比ASCII编码整整多了一倍存储空间,这就不划算了;
于是出现了可变长编码的UTF-8
编码,UTF-8
编码把一个Unicode
字符根据不同的数字大小编码成1-6个字节,常用的 英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节;
总结一下计算机系统通用的字符编码工作方式:
>>> print('包含中文的str')
包含中文的str
ord()
函数获取字符的整数表示,chr()
函数把编码转换为对应的字符:>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
str
:>>> '\u4e2d\u6587'
'中文'
str
,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str
变为以字节为单位的bytes
;bytes
类型的数据用带b
前缀的单引号或双引号表示:x = b'ABC'
bytes
的每个字符都只占用一个字节。str
通过encode()
方法可以编码为指定的bytes
,例如:>>> 'ABC'.encode('ascii') # 纯英文的str可以用ASCII编码为bytes,内容是一样的;
b'ABC'
>>> '中文'.encode('utf-8') # 含有中文的str可以用UTF-8编码为bytes;
b'\xe4\xb8\xad\xe6\x96\x87' # 在bytes中,无法显示为ASCII字符的字节,用\x##显示;
>>> '中文'.encode('ascii') # 含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错;
Traceback (most recent call last):
File "" , line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
bytes
。要把bytes
变为str
,就需要用decode()
方法:>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
>>> b'\xe4\xb8\xad\xff'.decode('utf-8') # 如果bytes中包含无法解码的字节,decode()方法会报错;
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore') # 如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节;
'中'
len()
函数计算str
包含多少个字符:>>> len('ABC')
3
>>> len('中文')
2
len()
函数计算的是str
的字符数,如果换成bytes
,len()
函数就计算字节数:>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x96\x87')
6
>>> len('中文'.encode('utf-8')) # 此处可见1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节;
6
str
和bytes
进行转换;#!/usr/bin/env python3
# -*- coding: utf-8 -*-
.py
文件就是UTF-8编码的,必须并且要确保文本编辑器正在使用UTF-8 without BOM编码:%
'亲爱的xxx你好!你xx月的话费是xx,余额是xx'
之类的字符串,而xxx的内容都是根据变量变化的,所以,需要一种简便的格式化字符串的方式,在python中是和c语言中一样的方法,用%
实现:>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
占位符 | 替换内容 |
---|---|
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
>>> print('%2d-%02d' % (3, 1))
3-01
>>> print('%.2f' % 3.1415926)
3.14
%s
永远起作用,它会把任何数据类型转换为字符串:>>> 'Age: %s. Gender: %s' % (25, True)
'Age: 25. Gender: True'
%%
表示一个%
;format()
{0}
、{1}
……;>>> classmates = ['Michael', 'Bob', 'Tracy']
>>>classmates # 变量classmates就是一个list;
['Michael', 'Bob', 'Tracy']
>>> len(classmates) # 可以用len()函数获得list元素的个数;
3
>>> classmates[0] # 通过索引来访问每一个位置的元素,切记索引是在0开始的;
'Michael'
>>> classmates[2]
'Tracy'
>>> classmates[-1] # 如果要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素;
>>> classmates[-2]
'Bob'
>>> classmates[-3] # 以此类推,可以获得倒数第2个,倒数第3个;
'Michael'
>>> classmates.append('Adm')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adm']
1
的位置:>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
pop()
方法:>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']
>>> classmates.pop(1) # 用pop(i)方法删除索引位置是 i 的位置
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']
>>> classmates[1] = 'Sarah'
>>> classmates
['Michael', 'Sarah', 'Tracy']
>>> L = ['Apple', 123, True]
>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4
>>> s[2][1]
'php'
>>> L = []
>>> len(L)
0
>>> classmates = ('Michael', 'Bob', 'Tracy')
append()
, insert()
的方法,但其他方法和list都一样,不可变的tuple有可以使得代码更加安全,所以可能的情况下,尽量用tuple代替list;>>> t = (1,)
>>> t
1
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
'a'
, 'b'
和一个list
age = 20
if age >= 18:
print('your age is', age)
print('adult')
else:
print('your age is', age)
print('teenager')
:
;elif
做更加细致的判断;age = 3
if age >= 18:
print('adult')
elif age >= 6:
print('teenager')
else:
print('kid')
if
语句执行有个特点,它是从上而下判断,如果在某个判断上是True
,把该判断的语句执行以后,就自动忽略下面的elif
和else
;if
判断语句还可以简写:if x:
print('True')
x
是非零数值、非空字符串、非空list等,就判断为True
,否则为False
。input()
函数来读取用户的输入,例如:birth = input('birth: ')
if birth < 200:
print('00前')
else:
print('00后')
1982
时,程序后报错,这是因为input()
返回的数据类型是str
,而str
是不能直接和整数相比较的,必须先把str
转换为整数,这时我们就需要int()
函数来完成这件事情:s = input('birth: ')
birth = int(s)
if birth < 2000:
print('00前')
else:
print('00后')
abc
,又会得到一个报错信息,这是因为int()函数发现一个字符串并不是合法的数字时就会报错;for...in
for...in
循环,依次把list和tuple中的每个元素迭代出来,例如:names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)
names
中每一个元素的;for x in ...
循环就是把每个元素代入变量x
,然后执行缩进的语句;# 计算1-100的整数之和
sum = 0
for x in range(101):
sum = sum + x
print(sum)
range()
函数,可以生成一个整数序列,再通过list()
函数可以转换为list,例如:>>> list(range(5))
[0, 1, 2, 3, 4]
while
-另外一种是while
循环,只要条件满足,就不断循环,条件不满足时退出循环;
# 计算100以内的所有奇数之和
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
L = ['Bart', 'Lisa', 'Adam']
for x in L:
print('Hello, %s!' % x)
Hello, Bart!
Hello, Lisa!
Hello, Adam!
break
break
语句可以提前退出循环;# 打印出 1-10
n = 1
while n <= 100:
if n > 10: # 当n = 11时,条件满足,执行break语句
break # break语句会结束当前循环
print(n)
n = n + 1
print('END')
continue
continue
语句来跳过当前的这次循环,直接开始下一次循环;n = 0 # 此程序可以打印出1-10
while n < 10:
n = n + 1
print(n)
n = 0
while n < 10:
n = n + 1
if n % 2 ==0: # 如果n是偶数,执行continue语句
continue # continue语句会直接继续下一轮循环,后面的print()语句不会执行
print(n)
dict
dict
,在其它语言中称为map
,使用键-值(key-value)存储,具有极快的查找速度;# 用普通方法来实现查找对应同学的成绩,需要两个list,当list越长,那耗时就越长
names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]
# 用dict方法来实现,只需“名字”-“成绩”的对照表,无论这个表多大,都不会变慢
>>> d = {'Michael' : 95, 'Bob' : 75, 'Tracy' : 85}
>>> d['Michael']
95
# 通过key的方式,将数据放入dict的方法
>>> d['Adam'] = 67
>>> d['Adam']
67
# 一种是通过in来判断key是否存在
>>> 'Thomas' in d
False
# 另外一种是通过dict()提供的get()方法,如果key不存在,可以返回 None
>>> d.get('Thomas') # 此处注意返回None的时候python的交互式环境不显示结果
>>> d.get('Thomas', -1)
-1
pop(key)
方法,对应的value也会从dict中删除;>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}
set
set
与key
类似,也是一组key的组合,但不存储value;>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
[1, 2, 3]
是一个list,而显示的{1, 2, 3}
只是告诉你这个set内部有1, 2, 3这三个元素,显示的顺序也不表示set是有序的;>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}
add(key)
可以往set中添加元素,可以重复添加但不会有效果;>>> s.add(4)
>>> s
{1, 2, 3, 4}
remove(key)
方法可以删除元素;>>> s.remove(4)
>>> s
{1, 2, 3}
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}
>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']
>>> a = 'abc'
>>> b = a.replace('a', 'A')
>>> b
'Abc'
>>> a
'abc'
a
是变量,而'abc'
才是字符串对象;a.replace('a', 'A')
时,实际上调用方法replace
是作用在字符串对象'abc'
上的,而这个方法虽然名字叫replace
,但却没有改变字符串'abc'
的内容。相反,replace
方法创建了一个新字符串'Abc'
并返回,如果我们用变量b
指向该新字符串,就容易理解了,变量a
仍指向原有的字符串'abc'
,但变量b
却指向新字符串'Abc'
了;