学了前面Python的基础语法,我们能做什么呢?在本次文章中我给大家演示一些基础语法的使用,加深大家对Python基础语法的了解。
下面这段程序,用到了变量、字符串、for循环、if条件控制来实现,根据用户输入的字符统计这段字符中数字、字符、空格的数量。
# coding=utf-8
s=input('请输入一段字符:\n')
# 定义Number类型的变量
chars=0
space=0
digit=0
others=0
# for循环遍历输入的字符串
for c in s:
if c.isalpha(): #判断是字符串类型
chars+=1
elif c.isspace(): #判断是空格
space+=1
elif c.isdigit(): #判断是数字类型
digit+=1
else: #其他类型
others+=1
# 分别打印不同类型的数据
print('chars=%d,space=%d,digit=%d,others=%d' %(chars,space,digit,others))
其中 input是用来接受用户输入信息的函数,括号中的
请输入一段字符
表示输入提示信息。
其中在上面这段代码中,用到了字符串的很多方法,其实字符串有很多常规方法
str="PYTHON"
print(str.isalnum()) # 判断所有字符都是数字或者字母
print(str.isalpha()) # 判断所有字符都是字母
print(str.isdigit()) # 判断所有字符都是数字
print(str.islower()) # 判断所有字符都是小写
print(str.isupper()) # 判断所有字符都是大写
print(str.istitle()) # 判断所有单词都是首字母大写,像标题
print(str.isspace()) # 判断所有字符都是空白字符、\t、\n、\r
除此之外,字符串还有大小写转换相关的方法
str="pyThon"
print(str.upper()) # 把所有字符中的小写字母转换成大写字母
print(str.lower()) # 把所有字符中的大写字母转换成小写字母
print(str.capitalize()) # 把第一个字母转化为大写字母,其余小写
print(str.title()) # 把每个单词的第一个字母转化为大写,其余小写
如果我们需要实现判断用户输入的一个数字是否是质数,这段程序应该怎么实现呢?
质数是指能够被1和它本身整除的数字
代码实现思路比较简单,只要当前输入的数字能够被除了1和自己本身以外的数字整除,就表示不是质数,实现代码如下。
# coding=utf-8
# 无限循环执行下面的代码,
while(True):
num=int(input('请输入一个数字:')) #接收用户的输入
if num>1: #如果输入的数字大于1,则执行下面的代码
for i in range(2,num): # 遍历2到输入的数字区间
if(num%i)==0: #只要输入的数字num,能够被这个区间内有任何数字整除,说明不是质数
print(num,"不是质数")
break #只要不是质数,则退出循环
else: # 否则表示是质数
print(num,"是质数")
else: #如果输入的数字小于等于1,则执行这个逻辑
print(num,"不是质数")
上述代码都是使用了前面学习过的基础知识。
•while循环
•if 条件判断
•for 循环
•range()内置函数
其中range()内置函数要解释一下,range()函数返回的是一个可迭代对象,它的语法定义如下
range(stop)
range(start,stop[,step])
参数说明如下:
•start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
•stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
•step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
for i in range(5):
print(i)
得到结果如下
0
1
2
3
4
带有步长的案例
for i in range(0,10,2):
print(i)
得到的结果如下
0
2
4
6
8
上述案例中,range(2,num)
,表示区间为2到输入的数字num这个区间。
基于range,我们还可以用来实现打印99乘法表,代码实现如下。
# 使用嵌套循环实现99乘法表。
for i in range(1, 10): #循环1到10
for j in range(1, i+1): # 循环区间是1,到i+1,i是第一层循环的值,随着第一层循环的执行,i的值也在增加。
print('{}x{}={}\t'.format(j, i, i*j), end='') #打印结果
print()
打印结果如下
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
简易计算器主要用到函数定义,函数调用、以及if条件判断,完成一个简易的demo实现。
# coding=utf-8
# 定义函数
def add(x, y):
"doc_相加"
return x + y
def subtract(x, y):
"doc_相减"
return x - y
def multiply(x, y):
"doc_相乘"
return x * y
def divide(x, y):
"doc_相除"
return x / y
# 用户输入
print("选择运算:")
print("1.相加")
print("2.相减")
print("3.相乘")
print("4.相除")
choice = input("输入你的选择(1/2/3/4):")
num1 = int(input("输入第一个数字: "))
num2 = int(input("输入第二个数字: "))
if choice == '1':
print(num1, "+", num2, "=", add(num1, num2))
elif choice == '2':
print(num1, "-", num2, "=", subtract(num1, num2))
elif choice == '3':
print(num1, "*", num2, "=", multiply(num1, num2))
elif choice == '4':
print(num1, "/", num2, "=", divide(num1, num2))
else:
print("非法输入")
执行结果如下
输入你的选择(1/2/3/4):2
输入第一个数字: 1
输入第二个数字: 2
1 - 2 = -1
list数组在前文有详细分析过,为了加深对list数组的了解,我们针对一个list数组实现数据元素的增删改查,代码如下。
# coding=utf-8
li=['Java','Python','JavaScript','Rust','Lua','C++']
def add(ele):
li.append(ele)
print('增加元素之后',li)
def remove(ele):
li.remove(ele)
print('删除元素之后',li)
def update(oldele,newele):
idx=0
i=0
for l in li:
i=i+1
if(l==newele): #判断元素所在的索引位置
idx=i
break
li.remove(oldele)
li.insert(idx,newele)
print('执行元素修改之后',li)
print('开始执行添加方法')
add('.Net')
print('开始执行修改方法')
update('Java','Docker')
print('开始执行删除方法')
remove('Python')
print('删除一个不存在的元素')
remove('Test')
上述代码实现均采用前面已经讲解过的一些Python基础语法
•定义了三个函数,分别是update
、remove
、add
实现对数组的修改、删除、新增•update
方法的实现稍微复杂一些,需要定位老元素所在的索引位置,然后再把老的元素删除,并在索引位置插入一个新的值,当然这里只是为了使用到一些语法而这么写,其实还可以这么优化
def update(oldele,newele):
idx=li.index(oldele) #获取老的元素所在的索引位置
li.remove(oldele) #移除老的元素
li.insert(idx,newele) #在老的索引位置插入一个新的元素
print('执行元素修改之后',li)
•最后,我们调用remove(‘Test’)
移除一个不存在的元素。
上述代码运行结果如下
开始执行添加方法
增加元素之后 ['Java', 'Python', 'JavaScript', 'Rust', 'Lua', 'C++', '.Net']
开始执行修改方法
执行元素修改之后 ['Docker', 'Python', 'JavaScript', 'Rust', 'Lua', 'C++', '.Net']
开始执行删除方法
删除元素之后 ['Docker', 'JavaScript', 'Rust', 'Lua', 'C++', '.Net']
删除一个不存在的元素
Traceback (most recent call last):
File "/Users/mic/PycharmProjects/pythonProject/test11.py", line 35, in
remove('Test')
File "/Users/mic/PycharmProjects/pythonProject/test11.py", line 10, in remove
li.remove(ele)
ValueError: list.remove(x): x not in list
最后当我们执行remove
移除一个不存在的元素时,会提示报错。这个是Python中的异常机制。异常信息是表示程序执行过程中出现的一些错误,比如在上述异常中,它提示了在test11.py
这个文件的第10行,li.remove(ele)
这个代码中,出现一个ValueError的异常,这个异常是说:x not in list
,表示list数组中不存在该元素。
代码编写完成后在运行时,可能会出现一些意料之外的异常,比如上面我们演示的一个例子中的异常。这些异常信息非常重要,它可以很好的提示代码在哪一个位置出现了什么样的异常,让开发者能够快速定位到问题并解决。
在Python有两种类型的异常
•语法错误•程序运行时异常
所谓语法错误,就是指编写的代码不符合Python的语法规定而提示的错误,比如下面这段代码
print 111
很明显是不符合语法规定的,正确的写法是print(111)
,当我们执行这段代码时,或得到下面这个错误提示
File "/Users/mic/PycharmProjects/pythonProject/test12.py", line 2
print 111
^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(111)?
提示类型为:SyntaxError,并且清晰的说明了问题以及可能修复的方法。
一般情况下,当我们对语法掌握非常熟练后,这类的问题一般不会出现。特别是我们使用比较成熟的开发工具比如PyCharm时,如果出现语法错误都会及时提示。
即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常,比如下面这段代码,语法是正常的。
print (1/0)
但是在执行的时候,会得到以下错误信息
Traceback (most recent call last):
File "/Users/mic/PycharmProjects/pythonProject/test12.py", line 2, in
print (1/0)
ZeroDivisionError: division by zero
从错误信息中可以看到,除数不能为0。
异常信息,不管是新手还是老手都会遇到,毕竟如果代码量足够多的情况下,无法避免会有一些地方考虑不到从而出现异常。因此程序编写完成后,都需要经过反复的测试来验证程序执行的准确性。
在程序编写中,我们必然会遇到一些可以预判到的异常,为了防止这些异常导致程序崩溃,我们可以提前使用异常处理方法来捕获这些异常。
在python中提供了try - except 的语句来处理异常信息。
try:
「正常执行的代码」
except {匹配的异常类型} 可选项:
「当`try`语句块中的代码出现异常时,会被执行的代码」
举个实际例子,在前面我们演示的Python案例中,都有涉及到用户输入数字进行处理的情况。
实际上,我们只能假设用户输入的是数字,如果用户输入的不是数字呢? 这种情况是我们可以预判并且进行提前规避处理的异常,所以我们可以这么实现
while True:
try:
x = int(input("请输入一个数字: "))
break
except ValueError:
print("您输入的不是数字,请再次尝试输入!")
执行结果如下
请输入一个数字: asf
您输入的不是数字,请再次尝试输入!
请输入一个数字: 234
try语句的工作方式如下:
•首先,执行 try语句块(在关键字 try 和关键字 except 之间的语句)。•如果没有异常发生,忽略 except 子句,try 语句块代码执行后结束。•如果在执行 try 语句块的过程中发生了异常,那么 try 语句块余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。•如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中(表示try嵌套的情况)。
上述try语句块的工作方式,可能的代码实现如下:
while True:
try:
x = int(input("请输入一个数字: "))
y = int(input('请另外一个数字:'))
try: #嵌套的try语句块
print(x/y)
except ZeroDivisionError: #对应匹配的异常信息,如果没有匹配,则会把异常传递给外层的try
print('除数为0异常')
break
except ValueError:
print("您输入的不是数字,请再次尝试输入!")
except:
print('其他错误类型')
try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。
它的功能和前文提到的while、for等else语句相同,这里的else 子句会在 try 子句没有发生任何异常的时候执行。
try-finally 语句无论是否发生异常都将执行最后的代码,执行流程如下。
使用方法如下
try:
#todo-正常执行的代码块
except AssertionError as error:
print(error)
else: # 如果没有异常时执行代码
try:
#todo-嵌套的try语句块
except ValueError as fnf_error:
print(fnf_error)
finally:
print('这句话,无论异常是否发生都会执行。')
Python 使用 raise 语句抛出一个指定的异常。
raise语法格式如下:
raise [Exception [, args [, traceback]]]
以下实例如果 x 大于 5 就触发异常:
x = 10
if x > 5:
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出,案例实现如下
try:
raise ValueError("数字格式异常") #主动抛出一个异常
except: #捕获到try语句块抛出的异常
print('捕获到异常')
raise #直接把异常再次抛出
运行结果如下
捕获到异常
Traceback (most recent call last):
File "/Users/mic/PycharmProjects/pythonProject/test12.py", line 3, in
raise ValueError("数字格式异常")
ValueError: 数字格式异常
异常的基本使用就介绍到这里,在后续的内容中,还会涉及到异常的其他用法,比如自定义异常,到需要的时候我们再做分析。