python
变量和简单类型
注释
-
单行注释
python使用井号(#)号表示单行注释的开始,#号后面知道这行结束为止的代码都将被解释器忽略
-
多行注释
使用三个单引号或三个双引号将注释的内容括起来
#这是一行简单的注释 print('Hello World!') ''' 这个是被三个单括号括起来的注释 ''' """ 这个是被三个双括号括起来的注释 """
变量
Python 需要使用标识符给变量命名,其实标识符就是用于给程序中变量、类、 方法命名的符号(简单来说,标识符就是合法的名字)。
Python 语言的标识符必须以字母、下画线(_)开头, 后面可以跟任意数目的字母、数字和下画线(_)。 此处的宇母并不局限于 26 个英文字母,可以包 含中文字符、日文字符等(python3 支持UTF-8)。
Python 语言是区分大小写的,因此 abc 和 Abe 是两个不同的标识符。
Python 使用等号(=)作为赋值运算符
Python 是弱类型语言,弱类型语言有两个典型特征。
-
变量无须声明即可直接赋值: 对一个不存在的变量赋值就相当于定义了一个新变量。
-
变量的数据类型可以动态改变:同一个变量可以一会儿被赋值为整数值, 一会儿被赋值为 字符串。
在使用标识符时,需要注意如下规则。
- 标识符可以由字母、数字、下画线(_)组成,其中数字不能打头。
- 标识符不能是 Python 关键字,但可以包含关键字。
- 标识符不能包含空格。
Python 还包含一系列关键字和内置函数, 一般也不建议使用它们作为变量名 。
-
如果开发者尝试使用关键字作为变量名 , Python 解释器会报错。
-
如果开发者使用内置函数的名字作为变量名, Python 解释器倒不会报错,只是该内置函数 就被这个变量覆盖了,该内置函数就不能使用了 。
Python 关键字
False | None | True | and | as |
assert | break | class | continue | def |
del | elif | else | except | finally |
for | from | global | if | import |
in | is | lambda | monlocal | not |
or | pass | raise | return | try |
while | with | yield |
python 内置函数
abs() | all() | any() | basestring() | bin() |
bool() | bytearray() | callable() | chr() | classmethod() |
cmp() | compile() | complex() | delattr() | dict() |
dir() | divmod() | enumerate() | eval() | execfile() |
file() | filter() | float() | format() | frozenset() |
getattr() | globals() | hasattr() | hash() | help() |
hex() | id() | input() | int() | isinstance() |
issubclass() | iter() | len() | list() | locals() |
long() | map() | max() | memoryview() | min() |
next() | object() | oct() | open() | ord() |
pow() | print() | property() | range() | raw_input() |
reduce() | reload() | repr() | reversed() | zip() |
round() | set() | setattr() | slive() | sorted() |
staticmethod() | str() | sum() | super() | tuple() |
type() | unichr() | unicode() | vars() | xrange() |
Zip() | __import__() | apply() | buffer() | coerce() |
intem |
数值类型
整型
Python 3 的整型支持各种整数值,不管是小的整数值,还是大的整数值
#定义变量 a,赋值为 56
a = 56
print(a)
#为 a 赋值一个大整数
a = 9999999999999999999999
print(a)
# type ()函数用于返回变量的类型 print (type (a))
Python 的整型支持 None 值(空值)
a = None
print(a)
Python 的整型数值有 4 种表示形式。
- 十进制形式: 最普通的整数就是十进制形式的整数。
- 二进制形式:以 0b 或 0B 开头的整数就是二进制形式的整数。
- 八进制形式: 以0o 或 0O开头的整数就是八进制形式的整数(第二个字母是大写或小写的 0)。
- 十六进制形式:以 0x 或0X 开头的整数就是十六进制形式的整数,其中 10~15 分别以 a-f (此处的a~f不区分大小写)来表示。
下面代码片段使用了其他进制形式的数。
#以 0x 或 0X开头的整型数值是十六进制形式的整数
hex_valuel = 0x13
hex_value2 = 0XaF
print("hexValuel 的值为:", hex_valuel)
print("hexValue2 的值为:", hex_value2)
#以 0b 或 0B 开头的整型数值是二进制形式的整数
bin_val = 0b111
print('bin_val 的值为:', bin_ val)
bin_val = 0B101
print('bin_val 的值为:', bin_val)
# 以 0o 或 0O 开头的整型数值是八进制形式的整数
oct_val = 0o54
print('oct_val 的值为:', oct_val)
oct_val= 0017
print('ct_val 的值为:', oct_val)
浮点型
浮点型数值用于保存带小数点的数值, Python 的浮点数有两种表示形式。
- 十进制形式:这种形式就是平常简单的浮点数,例如 5.12、 512.0、 0.512。浮点数必须包含 一个小数点,否则会被当成整数类型处理。
- 科学计数形式: 例如 5.12e2 、 5.12E2 。
字符串
Python 要求字符串必须使用引号括起来,单引号和双引号都行.
字符串和转义字符
- 使用不通的引号将字符串括起来
str1 = "I'm a coder" str2 = '"Spring is here, let us jam!", said woodchuck .'
- 使用转义字符(\)
str3 = '"we are scared, Let\'s hide in hte shade",says the bird'
字符串拼接(+)
s1 = "Hello," 'Charlie'
print(s1)
s2 = "Python "
s3 = "is Funny"
# 使用+拼接字符串
s4 = s2 + s3
print(s4)
数值转换字符串 str() 和 repr()
s1 = "这本书的价格是:"
p = 99.8
# 字符串直接拼接数值,程序报错
#print(s1 + p)
# 使用str()将数值转换成字符串
print(s1 + str(p))
# 使用repr()将数值转换成字符串
print(s1 + repr(p))
st = "I will play my fife"
print(st)
print(repr(st))
获取用户输入 input()
由于 input() 函数总会将用户输入的内容放入字符串中,因此用户可 以输入任何内容, input()函 数总是返回一个字符串。
msg = input("请输入你的值:")
print(type(msg))
print(msg)
长字符串(’’’)
长字符串可以让字符串中包含任何内容,既可包含单引号,也可包含双引号
Python 还允许使用转义字符(\) 换行符进行转义,转义之后的换行符不会“中断”字符串
s = '''"Let's go fishing", said Mary.
"OK, Let's go", said her brother.
they walked to a lake'''
print(s)
s2 ='The quick brown fox \
jumps over the lazy dog'
print(s2)
num = 20 + 3 / 4 + \
2 * 3
print(num)
原始字符串
原始字符串以“ ”开头 原始宇符串不会把反斜线当成特殊字符。
s1 = r'G:\publish\codes\02\2.4'
print(s1)
# 原始字符串包含的引号,同样需要转义
s2 = r'"Let\'s go", said Charlie'
print(s2)
#由于原始字符串中 的反斜线会对 引号进行转义,因此原始字符串的结尾处不能是反斜线一宇衍串结尾处的引 号就被转义了 ,这样就导致字符串不能正确结束。
s3 = r'Good Morning' '\\'
print(s3)
字节串(bytes)
bytes 对象只负责以宇节(二进制格式)序列来记录数据,至于这些数据到底表示 么内容,完全由程序决定。 如果采用合适的字符集 字符串 可以转换成字节串;反过来,宇节串也可以恢复成对应的字符串
bytes 保存的就是原始的字节(二进制格式)数据,因此 bytes 对象可用于在网络上传输数据 ,也可用于存储各种二进制格式的文件, 比如 图片、音乐等文件
字符串转换成 bytes 有如下 种方式:
- 如果字符串内容都是 ASCII 字符,则可以通过直接在字符串之前添加b来构建字节串值
- 调用 bytes()函数(其实是 bytes 构造方法)将字符串按指定 符集转换成字节串,如果不指定字符集,默认使用 UTF-8 字符集。
- 调用字符串本身 encode() 方法将字符串按指定字符集转换成字节串,如果不指定字符集, 默认使用 UTF-8字符集。
- bytes转换字符串 :decode()
例如,如下程序示范了如何创建字节串。
# 创建一个空的bytes
b1 = bytes()
# 创建一个空的bytes值
b2 = b''
# 通过b前缀指定hello是bytes类型的值
b3 = b'hello'
print(b3)
print(b3[0])
print(b3[2:4])
# 调用bytes方法将字符串转成bytes对象
b4 = bytes('我爱Python编程',encoding='utf-8')
print(b4)
# 利用字符串的encode()方法编码成bytes,默认使用utf-8字符集
b5 = "学习Python很有趣".encode('utf-8')
print(b5)
# 将bytes对象解码成字符串,默认使用utf-8进行解码。
st = b5.decode('utf-8')
print(st) # 学习Python很有趣
字符串的使用
转义字符
python支持的转义字符
转义字符 | 说明 |
---|---|
\b | 退格符 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符 |
" | 双引号 |
’ | 单引号 |
\ | 反斜线 |
s = 'Hello\nCharlie\nGood\nMorning'
print(s)
输出结果
Hello
Charlie
Good
Morning
s2 = '商品名\t\t单价\t\t数量\t\t总价'
s3 = 'python\t108\t\t2\t\t316'
print(s2)
print(s3)
输出结果
商品名 单价 数量 总价
python 108 2 216
字符串格式化
python提供了“%”对各种类型的数据进行格式化输出
price = 108
print("the book's price is %x" % price)
这行代码中的print函数包含三个部分,第一部分是格式字符串(相当于字符串的模版),其中包含一个“%s”占位符,它会被第三部分的变量或表达式的值代替。
格式化字符串中包含多个占位符,第三部分也应该提供多个变量,并且使用圆括号将这些变量括起来。
user = "Charli"
age = 8
# 格式化字符串有两个占位符,第三部分提供2个变量
print("%s is a %s years old boy" % (user , age))
转换说明符
转换说明符 | 说明 |
---|---|
d,i | 转换为带符号的十进制形式的整数 |
o | 转换为带符号的八进制形式的整数 |
x | 转换为带符号的十六进制形式的整数 |
X | 转换为带符号的十六进制形式的整数 |
e | 转换为科学计数法表示的浮点数(e小写) |
E | 转换为科学计数法表示的浮点数(E大写) |
f,F | 转换为十进制形式的浮点数 |
g | 智能选择使用f或e格式 |
G | 智能选择使用F或E格式 |
C | 转换为单字符(只接受整数或单字符字符串) |
r | 使用repr()将变量或表达式转换为字符串 |
s | 使用str()将变量或表达式转换为字符串 |
num = -28
print("num is: %6i" % num)
print("num is: %6d" % num)
print("num is: %6o" % num)
print("num is: %6x" % num)
print("num is: %6X" % num)
print("num is: %6s" % num)
num2 = 30
# 最小宽度为0,左边补0
print("num2 is: %06d" % num2)
# 最小宽度为6,左边补0,总带上符号
print("num2 is: %+06d" % num2)
# 最小宽度为6,右对齐
print("num2 is: %-6d" % num2)
my_value = 3.001415926535
# 最小宽度为8,小数点后保留3位
print("my_value is: %8.3f" % my_value)
# 最小宽度为8,小数点后保留3位,左边补0
print("my_value is: %08.3f" % my_value)
# 最小宽度为8,小数点后保留3位,左边补0,始终带符号
print("my_value is: %+08.3f" % my_value)
the_name = "Charlie"
# 只保留3个字符
print("the name is: %.3s" % the_name) # 输出Cha
# 只保留2个字符,最小宽度10
print("the name is: %10.2s" % the_name)
序列相关方法
字符串本质上是由多个字符组成,因此允许通过索引来操作字符
python字符串直接在方括号([])中使用索引即可获取对应的字符,第一个字符索引为0,第二个为1,倒数第一个为-1
获取一段用(:)
s = 'crazyit.org is very good'
# 获取s中索引2处的字符
print(s[2]) # 输出a
# 获取s中从右边开始,索引4处的字符
print(s[-4]) # 输出g
# 获取s中从索引3处到索引5处(不包含)的子串
print(s[3: 5]) # 输出zy
# 获取s中从索引3处到倒数第5个字符的子串
print(s[3: -5]) # 输出zyit.org is very
# 获取s中从倒数第6个字符到倒数第3个字符的子串
print(s[-6: -3]) # 输出y g
# 获取s中从索引5处到结束的子串
print(s[5: ]) # 输出it.org is very good
# 获取s中从倒数第6个字符到结束的子串
print(s[-6: ]) # 输出y good
# 获取s中从开始到索引5处的子串
print(s[: 5]) # 输出crazy
# 获取s中从开始到倒数第6个字符的子串
print(s[: -6]) #输出crazyit.org is ver
# 判断s是否包含'very'子串
print('very' in s) # True
print('fkit' in s) # False
# 输出s的长度
print(len(s)) # 24
# 输出'test'的长度
print(len('test')) # 4
# 输出s字符串中最大的字符
print(max(s)) # z
# 输出s字符串中最小的字符
print(min(s)) # 空格
大小写相关方法
在str类中与大小写相关的常用方法如下。
- title():将每个单词 首字母改为大写
- lower():将整个字符串改为小写
- upper(): 将整个字符串改为大写。
a = 'our domain is crazyit.org'
# 每个单词首字母大写
print(a.title())
# 每个单词首字母小写
print(a.lower())
# 每个单词首字母大写
print(a.upper())
删除空白
str 还提供了如下常用的方法来删除空白。
- strip():删除字符串前后 空白。
- strip():删除字符串前面(左边)的空白。
- rstrip(): 删除字符串后面(右边)的空白。
s = ' this is a puppy '
# 删除左边的空白
print(s.lstrip())
# 删除右边的空白
print(s.rstrip())
# 删除两边的空白
print(s.strip())
# 再次输出s,将会看到s并没有改变
print(s)
s2 = 'i think it is a scarecrow'
# 删除左边的i、t、o、w字符
print(s2.lstrip('itow'))
# 删除右边的i、t、o、w字符
print(s2.rstrip('itow'))
# 删除两边的i、t、o、w字符
print(s2.strip('itow'))
字符串查找和替换
str 还提供了如下常用的执行查找 、替换等操作的方法
- startswith():判断字符串是否 以指定子串开头。
- endswith():判断字符串是否以指定子串结尾
- find(): 查找指定子串在字符串中出现的位置,如果没有找到指定子串,则返回-1
- index(): 查找指定子串在字符串中出现的位置,如果没有找到指定子串,则引发ValueError错误。
- replace(): 使用指定子串替换字符串中的目标子串
- translate(): 使用指定的翻译映射表对字符串执行替换。
s = 'crazyit.org is a good site'
# 判断s是否以crazyit开头
print(s.startswith('crazyit'))
# 判断s是否以site结尾
print(s.endswith('site'))
# 查找s中'org'的出现位置
print(s.find('org')) # 8
# 查找s中'org'的出现位置
print(s.index('org')) # 8
# 从索引为9处开始查找'org'的出现位置
#print(s.find('org', 9)) # -1
# 从索引为9处开始查找'org'的出现位置
print(s.index('org', 9)) # 引发错误
# 将字符串中所有it替换成xxxx
print(s.replace('it', 'xxxx'))
# 将字符串中1个it替换成xxxx
print(s.replace('it', 'xxxx', 1))
# 定义替换表:97(a)->945(α),98(b)->945(β),116(t)->964(τ),
table = {
97: 945, 98: 946, 116: 964}
print(s.translate(table)) # crαzyit.org is α good site
Python 为str类提供了一个 maketrans()方法,通过该方法可以非常方便地创建翻
译映射表
>>> table = str.maketrans('abt', '123')
>>> table
{97: 49, 98: 50, 116: 51}
>>>
分割和连接
Python 还为 str 提供了分割和连接方法
- split(): 将字符串按指定分割符分割成多个短语
- join():将 多个短 吾连接成字符串
s = 'crazyit.org is a good site'
# 使用空白对字符串进行分割
print(s.split()) # 输出 ['crazyit.org', 'is', 'a', 'good', 'site']
# 使用空白对字符串进行分割,最多只分割前2个单词
print(s.split(None, 2)) # 输出 ['crazyit.org', 'is', 'a good site']
# 使用点进行分割
print(s.split('.')) # 输出 ['crazyit', 'org is a good site']
mylist = s.split()
# 使用'/'为分割符,将mylist连接成字符串
print('/'.join(mylist)) # 输出 crazyit.org/is/a/good/site
# 使用','为分割符,将mylist连接成字符串
print(','.join(mylist)) # 输出 crazyit.org,is,a,good,site
运算符
赋值运算符(=)
# 为变量st赋值为Python
st = "Python"
# 为变量pi赋值为3.14
pi = 3.14
# 为变量visited赋值为True
visited = True
print(st)
print(pi)
print(visited)
# 将变量st的值赋给st2
st2 = st
print(st2)
a = b = c = 20
print(a)
print(b)
print(c)
d1 = 12.34
# 将表达式的值赋给d2
d2 = d1 + 5
# 输出d2的值
print("d2的值为:%g" % d2 ) # 17.34
算术运算符
#++++++++++
a = 5.2
b = 3.1
the_sum = a + b
# sum的值为8.3
print("the_sum的值为:", the_sum)
#连接字符串
s1 = 'Hello, '
s2 = 'Charlie'
# 使用+连接两个字符串
print(s1 + s2)
#— - - - - - -
c = 5.2
d = 3.1
sub = c - d
# sub的值为2.1
print("sub的值为:", sub)
#***************
e = 5.2
f = 3.1
multiply = e * f
# multiply的值为16.12
print("multiply的值为:", multiply)
#连接字符串
s3 = 'crazyit '
# 使用*将5个字符串连接起来
#输出结果为:crazyit crazyit crazyit crazyit crazyit
print(s3 * 5)
#/ / / / / / / / /
#/ 普通除法,除不尽产生小数
#// 整除,小数舍弃
print("19/4的结果是:", 19/4)
print("19//4的结果是:", 19//4)
aa = 5.2
bb = 3.1
# aa / bb的值将是1.67741935483871
print("aa/bb的值是:", aa / bb)
# aa // bb值将是1.0
print("aa//bb的值是:", aa // bb)
#% % % % % % % % % %
#求余
print("5%3的值为:", 5 % 3) # 输出2
print("5.2%3.1的值为:", 5.2 % 3.1) # 输出2.1
print("-5.2%-3.1的值为:", -5.2 % -3.1) # 输出-2.1
print("5.2%-2.9的值为:", 5.2 % -2.9) # 输出-0.6
print("5.2%-1.5的值为:", 5.2 % -1.5) # 输出-0.8
print("-5.2%1.5的值为:", -5.2 % 1.5) # 输出0.8
#print("5对0.0求余的结果是:", 5 % 0.0) # 导致错误
#** ** ** ** ** ** **
#乘方运算符 **
print('5的2次方:', 5 ** 2) # 25
print('4的3次方:', 4 ** 3) # 64
print('4的开平方:', 4 ** 0.5) # 2.0
print('27的开3次方:', 27 ** (1 / 3)) # 3.0
位运算符
位运算符通常在图形、 图像处理和创建设备驱动等底层开发中使用 。 使用位运算符可以直接操作数值的原始 bit 位, 尤其是在使用自定义的协议进行通信时,使用位运算符对原始数据进行编码和解码也非常有效。
位运算符 | 说明 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 按位取反 |
<< | 左位移运算符 |
>> | 右位移运算符 |
位运算符的运算法则
第一操作数 | 第二操作数 | 按位与 | 按位或 | 按位异或 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
所有数值在计算机底层都是以二进制形式存在的,原码是直接将一个数值换算成二进制数。
有符号整数的最高位是符号位,符号位为0代表正数, 符号位为1代表负数。
无符号整数则没有符号位,因此无符号整数只能表示 0和正数。
为了方便计算,计算机底层以补码的形式保存所有的整数。
补码的计算规则是:
- 正数的补码和原码完全相同
- 负数的补码是其反码加1
反码是对原码按位取反,只是最高位(符号位)保持不变。
在进行位移运算时,不难友现,左移 n 位就相当于来以 2 的 11 次方,右移 n 位则相当于除以 2 的 n 次方(如果不能整除,实际返回的结果是小于除得结果数值的最大整数的)。不仅如此,进行位移运算只是得到 了 一个新的运算结果,而原来的操作数本身是不会改变的 。
# 将输出1
print(5 & 9