Python的语法结构
Python完全靠缩进表达代码逻辑,缩进4个空格
注释采用#,续行采用,与shell一致
同一行如果书写多条语句,可以用;分隔,与shell一致.但是,可读性差.
输入输出
print输出语句
>>> print('hello world!!')
hello world!!
#输出信息如果是字符串需要加引号,如果是变量则不需要加引号,单双引号没有区别
# 打印多项,用逗号分隔,输出各项间默认是空格
>>> print('hao ',123)
hao 123
#输出信息见间隔的定义使用sep来定义
>>> print('hao', 123, sep='~~~~')
hao~~~~123
#字符串相加
>>> print('hao'+'123')
hao123
#数字相加
>>> print(123 + 456)
579
#字符串相加
>>> print('123' + '456')
123456
#字符串和数字相加是会报错
>>> print('qwe'+123)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not int
input输入语句
>>> input()
10
'10'
#有交互式的输入
>>> input('name:')
name:lisi
'lisi'
#把输入存储到变量中,该变量一定是字符串类型
>>> name=input('name:')
name:lisi
>>> print(name)
lisi
>>> name
'lisi'
>>> n = input('number:')
number:12
>>> n
'12'
#变量不能直接与数字做运算
>>> n + 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be str, not int
#使用int转换变量类型
>>> int(n) + 3
15
#将数字3转换成字符串
>>> n + str(3)
'123'
name=input('name:')
print('欢迎 '+name)
print('欢迎', name)
print('欢迎 %s' % name) #%s是占位符,后面的name内容将会替代它
print('欢迎 %s' %name)
print('欢迎 % s' %name)
name:李思思
欢迎 李思思
欢迎 李思思
欢迎 李思思
欢迎 李思思
欢迎 李思思
变量
可以变化的量是变量,如a=10,以后还可以改变它,a=100
与变量相反的是字面量,如字符串"hello",数字100,都是字面量
写程序时,如果总是用字面量,就是硬编码
合法变量名的要求
首字符必须是字母或下划线其他字符可以是数字,字母,下划线区分大小写
推荐的名称的写法
变量名全部用小写,尽量有意义,pythonstring简短, pystr多个单词间用下划线分隔,py_str变量用名词,如phone;函数名用谓词(动词+名词),update_phone类名采用驼峰的形式,MyClass
变量赋值自右向左进行,将=右边表达式的计算结果赋值给左边的变量
>>> a = 12
>>> a = a + 5
>>> a
17
>>> a += 5
>>> a
22
>>> a -= 5
>>> a
17
>>> a *= 10
>>> a
170
>>> a /= 10
>>> a
17.0
变量在使用之前必须赋值
>>> b + 5 #变量b没有赋初值,将会出现名称错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
>>> b += 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
运算符
算数运算符
+ - * / // % **
>>> 5 / 3
1.6666666666666667
>>> 5 // 3 # 保留整数
1
>>> 5 % 3 # 取余,求模运算
2
>>> divmod(5, 3) # 5除以3,返回商和余数
(1, 2)
>>> a, b = divmod(5, 3) # 将商和余数分别赋值给a和b
>>> a
1
>>> b
2
>>> 2 ** 3 # 2的3次方,幂运算
8
>>> 3 ** 4
81
比较运算符,得到结果是真或假
< <= > >= == !=
>>> 3 = 3 # 这是赋值,不是比较,但数字不能作为变量首字符
File "<stdin>", line 1
SyntaxError: can't assign to literal
>>> 3 == 3 # 比较必须使用==表示判断是否相等
True
>>> 10 > 5 > 1 #Python支持连续比较
True
>>> 20 > 10 < 30 # 相当于 20 > 10 and 10 < 30
True
逻辑运算符,最终结果为True或False
and not or
>>> 10 > 50 and 10 < 15 # and两边全为True则为True
False
>>> 10 > 50 or 10 < 15 # or两边有一个True则为True
True
>>> not 10 > 50 or 10 < 15 # 涉及到可读性差的代码,应该加()
True
>>> not 10 > 50 # not是取反,真变假,假变真
True
数据类型
数字
int: 整数 bool:布尔值 float:浮点数 complex:复数
Python默认使用10进制数表示数字
以0o或0O开头表示8进制数
以0x开头表示16进制数
以0b开头表示2进制数
# 有小数点的为浮点数
>>> type(1.65)
<class 'float'>
#没有小数点的为整数
>>> type(10)
<class 'int'>
# True和False值分别为1和0
>>> True + 1
2
>>> False *5
0
# 将十进制转化为8进制
>>> oct(10)
'0o12'
将10进制转化为16进制
>>> hex(20)
'0x14'
#将十进制转化成2进制
>>> bin(7)
'0b111'
字符串:引号引起来的部分.
单双引号没有什么区别 三引号就是三个连续的单引号或双引号,可以保存用户的输入格式
>>> words = "hello #
File "<stdin>", line 1
words = "hello
^
SyntaxError: EOL while scanning string literal
>>> words = 'hello
File "<stdin>", line 1
words = 'hello
^
SyntaxError: EOL while scanning string literal
>>> words = "hello\nnew\nlisi"
>>> print(words) # print 将\n转义成回车
hello
new
lisi
#三引号可以保存用户的输入格式
>>> wds = """hello
... new
... lisi"""
>>> print(wds)
hello
new
lisi
>>> wds
' hello\nnew \nlisi\n'
>>> py_str = 'python'
>>> len(py_str) # 计算长度
6
>>> py_str[1] # 取下标为1的字符
'y'
>>> py_str[5]
'n'
>>> py_str[6] # 下标超出范围将会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>> py_str[-1] # 下标为负数则由右至左
'n'
>>> py_str[2:3] # 切片提取,起始下标包含,结束下标不包含
't'
>>> py_str[2:4]
'th'
>>> py_str[2:7] # 切片不会出现下标越界的错误
'thon'
>>> py_str[2:] # 结束不写,表示取到结尾
'thon'
>>> py_str[:2] # 起始不写,表示从开头取
'py'
>>> py_str[:] # 都不写,表示从开头去取到结尾
'python'
>>> py_str[::2] # 切片默认步长为1,该为2
'pto'
>>> py_str[1::2]
'yhn'
>>> py_str[::-1] # 步长值为负数表示从右往左取
'nohtyp'
>>> py_str + ' 123' # 字符串拼接
'python 123'
>>> '~' * 10 # ~号重复10次
'~~~~~~~~~~'
>>> 't' in py_str # t在字符串中吗?
True
>>> 'th' in py_str # th在字符串中吗?
True
>>> 'to' in py_str # to在字符串中吗?
False
>>> 'to' not in py_str # to不在字符串中吗?
True
列表,与字符串类似,都是序列对象,列表可变,可以把元素重新赋值
>>> alist = [1, 2, 3, 'tom', 'jerry']
>>> len(alist)
5
>>> alist[0]
1
>>> alist[0:4]
[1, 2, 3, 'tom']
>>> alist + [10]
[1, 2, 3, 'tom', 'jerry', 10]
>>> alist * 2
[1, 2, 3, 'tom', 'jerry', 1, 2, 3, 'tom', 'jerry']
# 向列表尾部追加一个字符串
>>> alist.append('asd')
>>> alist
[1, 2, 3, 'tom', 'jerry', 'asd']
# 可以给元素重新赋值
>>> alist[0] = 100
>>> alist
[100, 2, 3, 'tom', 'jerry', 'asd']
元组可以认为它是不可改变的数组
>>> atup = (1, 2, 3, 'bob')
>>> len(atup)
4
>>> atup[0]
1
>>> atup[2:]
(3, 'bob')
>>> atup[0] = 10 # 元组不可变,所以不能把他的元素重新赋值
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
字典: 采用key:val的形式,没有顺序,所以没有下标.
>>> zidian = {'name': 'lisi', 'age': 18}
>>> len(zidian)
2
>>> zidian[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 0
>>> 'tom' in zidian
False
>>> 'name' in zidian
True
>>> zidian['name']
'lisi'
数据类型特点
按存储模型分类
标量:数据中不能包含其他类型数据. 数字,字符串容器: 可以包含其他类型数据. 列表,元组,字典 按照更新模型分类
不可变: 数字,字符串,元组可变: 列表,字典 按访问模型分类
直接: 数字顺序: 字符串,列表,元组映射: 字典
判断语句
标准if条件语句的语法
if 判断条件:
如果条件为真才执行的语句块
else:
判断条件为假才执行的语句,不是必须的
判断条件
py_str = 'qweasd'
if 'qw' in py_str:
print('qw在Python中')
if -0.0:
print('值为0的数字为假')
if ' ':
print('空格也是一个字符,为真')
if []:
print('空列表为假')
if (1, 2):
print('非空元组为真')
if {'name': 'lisi'}:
print('非空字典为真')
if not {}:
print('空字典为假,取反为真')
if not None:
print('None表示空对象,类似与MySQL中的null,为假,取反为真')
if 'c' > 'b':
print('a')
结果:
qw在Python中
空格也是一个字符,为真
非空元组为真
非空字典为真
空字典为假,取反为真
None为空,为假,取反为真
a
条件表达式,三元运算
b = 20
if a<b :
s1=a
else:
s1=b
print('s1=%s' %s1)
s2 = a if a < b else b
print('s2=%s'%s21
结果:
s1=10
s2=10
案例1
创建login.py文件提示用户输入用户名和密码获得到相关信息后,将其保存在变量中如果用户输的用户名为bob,密码为123456,则输 出Login successful,否则输出Login inorrect
#!/home/student/Pytest/bin/python
import getpass
# 密码不显示进行输入
user=input('姓名:')
password = getpass.getpass('密码:')
if user == 'bob' and password == '123456':
#32是绿色 前景色,40以上是背景色
# \033[0m是关闭颜色
print('\033[32;1mLogin successful\033[0m')
else:
print('\033[31;1mLogin inorrect\033[0m')
结果:
姓名:asds
密码:ggw
Login inorrect
姓名:bob
密码:123456
Login successful
案例2
创建grade.py脚本,根据用户输入的成绩分档,要求如下:
如果成绩大于60分,输出“及格”如果成绩大于70分,输出“良”如果成绩大于80分,输出“好”如果成绩大于90分,输出“优秀”否则输出“你要努力了”
cj = float(input('请输入成绩:'))
if cj < 60:
print('你要努力了')
elif cj < 70:
print('及格')
elif cj < 80:
print('良')
elif cj < 90:
print('好')
else:
print('优秀')
cj = float(input('请输入成绩:'))
if 60 <= cj < 70:
print('及格')
elif 70 <= cj < 80:
print('良')
elif 80 <= cj < 90:
print('好')
elif 90 <= cj:
print('优秀')
else:
print('你要努力了70')
案例3
编写game.py,要求如下:
计算机随机出拳玩家自己决定如何出拳代码尽量简化
#一般思路版
import random
choose = ['剪刀', '石头', '布']
cp_choose = random.choice(choose)
player = input('请出拳(石头,剪刀,布):')
print('compute`s choose:%s your choose:%s' %(cp_choose,player))
if cp_choose == '石头':
if player == '石头':
print('平局')
elif player == '剪刀':
print('you lost')
else:
print('you win')
elif cp_choose == '剪刀':
if player == '石头':
print('you win')
elif player == '剪刀':
print('平局')
else:
print('you lost')
else:
if player == '石头':
print('you lost')
elif player == '剪刀':
print('you win')
else:
print('平局')
#简化思路版
import random
choose = ['剪刀', '石头', '布']
#这里先把可能输的情况都列举出来,玩家选择在前
lose_list = [['剪刀', '石头'], ['石头', '布'], ['布', '剪刀']]
cp_choose = random.choice(choose)
player = input('请出拳(石头,剪刀,布):')
print('compute`s choose:%s your choose:%s' %(cp_choose,player))
if cp_choose == player:
print('平局')
elif [player, cp_choose] in lose_list:
print('you lose!!')
else:
print('you wim')