Python是一门弱类型语言,弱类型包含两方面的含义:①所有的变量无须声明即可使用;②变量的数据类型可以随时改变。
一、注释
注释的作用是用来解释程序某些部分的作用和功能,提高程序的可读性。
Python源代码的注释有两种形式:
● 单行注释:使用(#)表示单行注释的开始,#号后面直到这行结束为止的代码都将被解释器忽略
● 多行注释:使用三个单引号或三个双引号将注释内容括起来。
注释本身对程序并没有任何影响,主要作用是给“别人看”,Python解释器会忽略这些注释内容。
二、变量
变量就像一个个小容器,用于“盛装”程序中的数据。
常量与变量的区别:常量一旦保存某个数据之后,该数据就不能发生改变;变量保存的数据可以多次发生改变,主要程序对变量重新赋值。
(=)赋值运算符,将值赋给变量。
查看变量类型可以使用type()函数
# 定义一个数值类型变量
a = 5
print(a)
# 重新将字符串赋值给a变量
a = 'Hello, Joe'
print(a)
print(type(a))
运行结果
5
Hello, Joe
print()函数详细语法格式:
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
value参数可以接受任意多个变量或值
user_name = 'Joe'
user_age = 40
# 同时输出多个变量和字符串
print("用户名:", user_name, "年龄:", user_age)
输出结果:
用户名: Joe 年龄: 40
默认情况下,Python使用空格隔开多个变量,如果希望改变默认的分隔符,可以通过指定sep参数进行设置。
print("用户名:", user_name, "年龄:", user_age, sep="|")
输出结果:
用户名:|Joe|年龄:|40
默认情况下,print()函数的end参数默认值为'\n'因此,print()函数输出之后总会换行,要改变这儿默认行为,可以重设end参数,如:
print(40, '\t', end="")
print(50, '\t', end="")
print(60, '\t', end="")
输出结果:
40 50 60
print()函数的file参数默认值sys.stdout,代表了希望标准输出,一般情况下是屏幕,也可以更改该值让程序将结果输出到文件。如:
f = open("poem.txt", "w") # 打开文件以便写入
print('两情若是久长时', file=f)
print('又岂在朝朝暮暮', file=f)
f.close()
print()函数的flush参数用于控制输出缓存,该参数一般保持False即可,这样可以获得较好的性能。
Python语言的标识符必须以字母、下划线(_)开头,后面可以跟任意数目的字母、数字、和下划线(_)。此处的字母并不局限于26个英文字母,可以包含中文字符、日文字符等。
Python2.x对中文支持较差,如果要在Python2.x程序中使用中文字符或中文变量,则需要在python源程序的第一行增加"# coding:utf-8",然后将源文件保存为UTF-8字符集。
Python语言区分大小写,因此abc和Abc是两个不同的标识符。
标识符规则:
● 标识符可以由字母、数字、下划线(_)组成,其中数字不能打头。
● 标识符不能是Python关键字,但可以包含关键字。
● 标识符不能包含空格。
表2.1 Python关键字
False | None | True | and | as |
assert | break | class | continue | def |
del | elif | else | except | finally |
for | from | global | if | import |
in | is | lambda | nonlocal | not |
or | pass | raise | return | try |
while | with | yield |
实际上并不需要记忆关键字列表,开发时可以随时通过程序来查看Python所包含的关键字,如下所示:
# 导入keyword模块
import keyword
# 显示所有关键字
print(keyword.kwlist)
输出结果:
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
表2.2 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() | slice() | sorted() |
staticmethod() | str() | sum() | super() | tuple() |
type() | unichr() | unicode() | vars() | xrange() |
Zip() | __import__() | apply() | buffer() | coerce() |
intern |
以上内置函数的名字也不应该作为标识符,否则python的内置函数会被覆盖。
三、数值类型
1.整型
Python的整型支持None值(空值)
Python的整型数值有4种表示形式。
● 十进制形式:最普通的整数就是十进制形式的整数。
● 二进制形式:以0b或者0B开头的整数就是二进制形式的整数。
● 八进制形式:以0o或者0O开头的整数就是八进制形式的整数
● 十六进制形式:以0x或者0X开头的整数就是十六进制形式的整数,其中10~15分别以a~f来表示
为了提高数值(包括浮点型)的可读性,Python3.x允许为数值(包括浮点型)增加下划线作为分隔符。这些下划线不会影响数值本身。
# 在数值中使用下划线
one_million = 1_000_000
print(one_million)
prince = 234_234_234 # price实际的值为234234234
android = 1234_1234 # android实际的值为12341234
2. 浮点型
Python浮点数有两种表示形式:
● 十进制形式:这种形式就是平常简单的浮点数,例如:5.12、512.0、0.512 。浮点数必须包含一个小数点,否则会被当成整数处理。
● 科学计数形式:如:5.12e2(5.12 × 102)、5.12E2
3. 复数
Python可以支持复数,复数的虚部用j或J来表示。
Python的cmath模块支持复数运算。
四、 字符串入门
字符串的意思就是“一串字符”
字符串既可以用单引号括起来,也可以用双引号括起来。
Python允许使用反斜线(\)将字符串中的特殊字符进行转义。
将数值转换成字符串,可以使用str()或repr()函数。
input()函数用于向用户生成一条提示,然后获取用户输入的内容,而input()函数总是返回一个字符串。
Python2中使用raw_input()函数实现同样的功能。
Python不是格式自由的语言,因此Python程序的换行、缩进都有其规定的语法。
原始字符串以“r”开头,原始字符串不会把反斜线当成特殊字符。
如果原始字符串包含引号,程序同样需要对引号进行转义(否则Python同样无法对字符串的引号精确配对),但此时用于转义的反斜线会变成字符串的一部分。如:
>>> # 原始字符串包含的引号,同样需要转义
>>> s2 = r'"Let\'s go", said Charlie'
>>> print(s2)
"Let\'s go", said Charlie
Python3新增了tytes类型,用于代表字节串。字符串(str)由多哦字符组成,以字符为单位进行操作;字节串(bytes)由多个字节组成,以字节为单位进行操作。
bytes对象只负责以字节(二进制格式)序列来记录数据。采用合适的字符集,字符串可以转换为字节串,字节串也可以恢复成对应的字符串。
由于bytes保存的就是原始的字节(二进制格式)数据,因此byes对象可用于在网络上传输数据,也可用于存储各种二进制格式的文件,比如图片、音乐等文件。
将一个字符串转换成bytes对象,有三种方式:
● 如果字符串内容都是ASCII字符,则可以通过直接在字符串之前添加b来构建字节串值。
● 调用bytes()函数(其实是bytes的构造方法)将字符串按指定字符集转成字节串,默认使用UTF-8字符集。
● 调用字符串本身的encode()方法将字符串按指定字符集转换成字节串,默认使用UTF-8字符集。
计算机底层有两个基本概念:位(bit)和字节(byte),其中bit代表1位,要么是0,要么是1,byte代表1字节,1字节包含8位。
在字节串中每个数据单元都是字节,也就是8位,其中每4位(相当于4位二进制数,最小值为0,最大值为15)可以用一个十六进制数来表示,因此每字节需要两个十六进制数表示。
可以调用bytes对象的decode()方法将其解码成字符串。
表2.3 Python支持的转义字符
转义字符 | 说明 |
\b | 退格符 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符 |
\" | 双引号 |
\' | 单引号 |
\\ | 反斜杠 |
Python提供了“%”对各种类型的数据进行格式化输出:
price = 108
print("the book's price is %s" % price)
格式化字符串中的“%s”被成为转换说明符,作用相当于一个占位符。
表2.4 转换说明符
转换说明符 | 说明 |
d,i | 转换为带符号的十进制形式的整数 |
o | 转换为带符号的八进制形式的整数 |
x | 转换为带符号的十六进制形式的整数 |
X | 转换为带符号的十六进制形式的整数 |
e | 转换为科学计数法表示的浮点数(e小写) |
E | 转换为科学计数法表示的浮点数(E大写) |
f, F | 转换为十进制形式的浮点数 |
g | 智能选择使用f或者e格式 |
G | 智能选择使用F或者E格式 |
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)
输出结果:
num is: -28
num is: -28
num is: -34
num is: -1c
num is: -1C
num is: -28
默认情况下,转换出来的字符串总是右对齐的,不够宽度时左边补充空格。可以在最小宽度之前添加一个标志来改变这种行为,python支持如下标志:
● -:指定左对齐
● +:表示数值总要带着符号(正数带“+”,负数带“-”)
● 0:表示不补充空格,而是补充0
对于浮点数,Python还允许指定小数点后的数字位数,对于字符串,Python允许指定转换后字符串的最大字符数,这个该精度值被放在最小宽度之后:
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)
# 只保留2个字符,最小宽度为10
print("the name is: %10.2s" % the_name)
输出结果:
my_value is: 3.001
my_value is: 0003.001
my_value is: +003.001
the name is: Cha
the name is: Ch
Python是“自带文档”的,使用dir()函数列出指定类或模块包含的全部内容(包括函数、方法、类、变量等),如:
>>> dir(str)
['__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', 'isascii', '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']
使用help()函数查看某个函数或方法的帮助文档:
>>> help(str.title)
Help on method_descriptor:
title(self, /)
Return a version of the string where each word is titlecased.
More specifically, words start with uppercased characters and all remaining
cased characters have lower case.
str类中大小写先关常用方法:
● title():将每个单词的首字母改为大写
● lower():将整个字符串改为小写
● upper():将整个字符串改为大写
str类中删除空白的方法:
● strip():删除字符串前后的空白
● lstrip():删除字符串前面(左边)的空白
● rstrip():删除字符串侯建(右边)的空白
str类中查找、替换相关方法
● startswith():判断字符串是否以指定子串开头
● endswith():判断字符串是否以指定子串结尾
● find():查找指定子串在字符串中出现的位置,如果没有找到则返回-1
● index():查找指定子串在字符串中出现的位置,如果没有找到引发ValueError异常。
● replace():使用指定子串替换字符串中的目标子串
● translate():使用指定的翻译映射表对字符串执行替换
Python为str提供了maketrans()方法,可以方便的创建翻译映射表:
>>> table = str.maketrans('abt', 'αβτ')
>>> table
{97: 945, 98: 946, 116: 964}
Python2.x中str类没有maketrans()方法,需要导入string模块,然后调用maketrans()函数。
str类中的分割、连接方法
● split():将字符串按指定分割符分割成多个短语
● join():将多个短语连接成字符串
五、运算符
运算符是一种特殊的符号,用来表示数据的运算、赋值和比较等。可分为以下几种:
● 赋值运算符
● 算术运算符
● 位运算符
● 索引运算符
● 比较运算符
● 逻辑运算符
1. 赋值运算符
Python使用“=”作为赋值运算符
2. 算术运算符
+、-、*、/、//、%
3. 位运算符
&、|、^、~、<<、>>
表2.5 位运算符的运算法则
第一个操作数 | 第二个操作数 | 按位与 | 按位或 | 按位异或 |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
补码计算规则:整数的补码和原码相同,负数的补码是其反码加1
4. 扩展后的赋值运算符
+=、-=、*=、/=、//=、%=、**=、&=、|=、^=、<<=、>>=
5. 索引运算符
索引运算符就是方括号[],可以使用单个索引值也可以使用范围以及步长。
6. 比较运算符与bool类型
Python的bool类型只有两个值True和False
>、>=、<、<=、==、!=、is、is not
7. 逻辑运算符
and、or、not
8. 三目运算符
True_statements if expression else False_statements
运算规则:先对逻辑表达式expression求值,如果值为True,则执行并返回True_statements,否则执行并返回False_statement的值。
Python允许在三目运算符的True_statements或False_statements中放置多条语句,有两种方式:
● 以英文逗号分隔:每条语句都会执行,程序返回多条语句的返回值组成的元组
● 以英文分号分隔:每条语句都会执行,程序只返回第一条语句的返回值
a = 5
b = 3
# 以逗号分隔
st = print("crazyit"), 'a大于b' if a > b else 'a不大于b'
print(st)
# 以分号分隔
st = print("crazyit"); x = 20 if a > b else 'a不大于b'
print(st)
print(x)
输出结果:
crazyit
(None, 'a大于b')
crazyit
None
20
9. in运算符
用于判断某个成员是否位于序列中。
10. 运算符的结合性和优先级
不要把一个表达式写得过于复杂,可以分几步来完成一个复杂的表达式
不要过多的依赖运算符的优先级来控制表达式的执行顺序,尽量使用“()”来控制表达式的执行顺序。
练习题:
1. 使用数值类型声明多个变量,并使用不同方式为不同的数值类型的变量赋值。熟悉每种数据类型的赋值规则和表示方式。
int_value = 10
bin_value = 0b12
oct_value = 0o23
hex_value = 0xff
float_value = 10.23
e_value = 3.14e2
plural_value = 10 + 4.3j
2 . 使用数学运算符、逻辑运算符编写40 个表达式,先自行计算各表达式的值,然后通过程序输出这些表达式的值进行对比,看看能否做到一切尽在掌握中。
a = 3
b = 5
c = 'hello'
d = 'world'
e = 0.2
f = 0.4
g = True
h = False
result = a + b # 8
print(result)
result = a - b # -2
print(result)
result = a * b # 15
print(result)
result = a / b # 0.6
print(result)
result = a // b # 0
print(result)
result = a % b # 2
print(result)
result = a ** b # 243
print(result)
result = c + d # helloworld
print(result)
result = g and h # False
print(result)
result = g or h # True
print(result)
result = not g # False
print(result)
result = e + f # 0.6
print(result)
result = e - f # -0.2
print(result)
result = e * f # 0.08
print(result)
result = e / f # 0.5
print(result)
result = e // f # 0.0
print(result)
result = e ** f # 0.5
print(result)
result = e % f # 0.2
print(result)
3. 从标准输入读取两个整数并打印两行,其中第一行输出两个整数的整除结果;第二行输出两个整数的带小数的除法结果。不需要执行任何四舍五入或格式化操作。
num1 = input('请输入第一个整数:')
num2 = input('请输入第二个整数:')
value1 = int(num1) // int(num2)
value2 = int(num1) / int(num2)
print('第一个数整除第二个数的结果为:', str(value1))
print('第一个数除以第二个数的结果为:', str(value2))
4. 从标准输入读取两个整数并打印三行,其中第一行包含两个数的和;第二行包含两个数的差(第一个数减第二个数):第三行包含两个数的乘积结果。
num1 = int(input('请输入一个整数:'))
num2 = int(input('请输入另一个整数:'))
print('两个数的和为:', num1 + num2)
print('两个数的差为:', num1 - num2)
print('两个数的积为:', num1 * num2)
5. 用户输入一个字符串和一个子串,程序必须打印出给定子串在目标字符串中出现的次数。字符串遍历将从左到右进行,而不是从右到左。例如给定‘ABCDCDC' 和'CDC',程序输出“ 2 ”。
s1 = input('请输入一个字符串:')
s2 = input('请输入一个子串:')
s1_len = len(s1)
s2_len = len(s2)
count = 0
for i in range(s1_len - 1):
if s1[i:i+s2_len] == s2:
count += 1
print('子串在字符串中出现的次数:%d' % count)
6. 给定任意一个整数,打印出该整数的十进制、八进制、十六进制(大写)、二进制形式的字符串。
num = 14
print('十进制形式为:%d' % num)
print('二进制形式为: %s' % bin(num))
print('八进制形式为:%o' % num)
print('十六进制形式为: %x' % num)
print('十六进制形式为(大写): %X' % num)
7. 通过学习我们知道str是不可变的,本程序要实现一个功能:用户输入一个字符串,修改该字符串中哪个位置的字符,程序就会输出修改后的结果。比如用户输入:
’ fkjava. org ’
6 -
程序将会输出: ’fkjava-org’ 。
s1 = input('请输入一个字符串:')
index = int(input('请输入一个位置:'))
s2 = input('请输入替代字符:')
s_new = s1[:index] + s2 + s1[index+1:]
print(s_new)