Python小程序-迭代输出多层嵌套列表中的每个元素并显示嵌套列表的层次结构

程序代码:

def iteration(list_name,indent = False,level = 0):
    '''此函数的作用是迭代输出一个列表及其中的嵌套列表中的每个元素。
    其包含三个参数,第一个参数是要传入的列表的名称,第二个参数是控
    制是否使用缩进来显示列表中的嵌套的层次结构,第三个参数是控制输
    出时是否首行缩进,其数值就是使用Tab缩进的次数'''
    for i in list_name:
        if isinstance(i,list):
            iteration(i,indent,level + 1) #利用递归函数处理嵌套列表
        else:
            if indent:
                print('\t' * level,end='')
            print(i)
list1=['aa',['bb',['cc',['dd','ee']]],'ff'] #定义一个待处理的多层嵌套列表
iteration(list1,True,0) #调用iteration函数对其处理

程序输出:

aa
    bb
        cc
            dd
            ee
ff

Python的异常处理机制

程序在运行时难免会因为各种“意外因素”或程序本身的逻辑问题导致出错,严重时这将使程序彻底崩溃。解决这些问题常规的思路就是增加大量的逻辑判断语句来消灭种种可能引起问题的“意外因素”,但这无疑会使程序代码变得复杂而庞大,并且十分脆弱。有没有更好的解决办法呢?如果没有的话也不会有你看到的这篇文章了,哈哈哈~

可以在错误(Python中称之为“异常”)产生时捕获异常,并按照给定的异常恢复代码尝试恢复异常。当然,如果你不捕获异常,那么当异常发生时,程序就必死无疑了。

先来看一个小程序。

给出一个文本文件“file.txt”,文件内容如下所示。要求:利用Python字符串的split()方法来分别获取每行字符串中”:”两边的字符,以第一行字符串为例,要求最终输出为此形式:aa said: aaa

aa:aaa
bb:bbb
(ccc)
dd:ddd
ee:eee
ff:fff:fff

编写程序如下。

file_data = open('file.txt','r',encoding='UTF-8')        #打开"file.txt"文件
for i in file_data:                 #利用for循环迭代读取"file.txt"文件的内容
    (a,b) = i.split(':',1)          #利用字符串的split()方法,以":"为切割条件(只切割一次),对每行字符串进行分割操作,最后将生成的列表中的两个元素分别赋值给变量a、b。
    print(a,end = '')               #输出变量a
    print(' said: ',end = '')       #输出字符串" said "
    print(b,end = '')               #输出变量b
file_data.close()                   #关闭文件

看似程序的逻辑上是没有问题的,但是运行后会发现Python的解释器抛出了如下异常。

aa said: aaa               #按照程序中预设的逻辑正确输出了处理后的字符串
bb said: bbb               #正确输出
Traceback (most recent call last):      #抛出了一个Traceback类型的异常!!!
 File "./a.py", line 5, in <module>
 (aa,bb) = i.split(':',1)
ValueError: not enough values to unpack (expected 2, got 1)

上面的异常的内容大致是:没有足够的值来赋给变量,应该有两个值,但现在只有一个。

查看”file.txt”文件的内容,可以发现,第三行的内容是:

(ccc)

这个字符串中没有包含“:”,理所当然的,split()方法并没有将其切割为列表的两个元素,所以在赋值时就产生了错误。

解决这个错误可以用逻辑判断语句来针对特定的场景给出特定的解决方法(预防异常产生),如下:

file_data = open('file','r',encoding='UTF-8')
for i in file_data:
    if not i.find(':') == -1:        #增加一个判断,只有当字符串中包含“:”字符时才执行相关语句。
        (aa,bb) = i.split(':',1)
        print(a,end = '')
        print(' said: ',end = '')
        print(b,end = '')
file_data.close()

这种方法虽然能解决问题,但需要对每一种可能出现的错误情况给出特定的逻辑判断语句及其他程序代码才能避免异常,这样做的弊端是显而易见的,毕竟且不论编写这样的代码有多么繁琐,光是考虑日后维护代码的工作量就已经令人窒息。

下面来看另一种解决方法:利用异常处理来解决此问题(允许异常产生,但会捕获异常并进行修复)。

file_data = open('file','r',encoding='UTF-8')
for i in file_data:
    try:             #捕获异常
        (a,b) = i.split(':',1)
        print(a,end = '')
        print(' said: ',end = '')
        print(b,end = '')
    except:          #给出修复异常的程序代码
        continue     #跳过本次循环
file_data.close()

程序正确执行并给出如下输出:

aa said: aaa
bb said: bbb
dd said: ddd
ee said: eee
ff said: fff:fff

异常处理的工作原理就是像文章开头说的那样,捕获一个异常,然后按照给定的恢复的代码来尝试恢复异常,就这么简单。

上边的例子中,我们捕获了全部的异常,并对所有的异常应用了同一段恢复代码,那该如何针对某一类型的异常执行某一特定的恢复代码呢?

可以这样写,这里只对IOError类型的错误应用恢复代码:

try :
    ...
except IOError:
    ...

以上介绍的就是Python的异常处理机制是简单用法,异常处理的好处就是可以让你能更加专注实现程序本身的功能,而不必费时费力的预先考虑各种可能产生的错误并写出预防错误的相应的逻辑判断及额外代码。

Python利用递归函数迭代输出多层嵌套列表中的每个元素

Python的列表很强大也很灵活,如何运用好列表就是一门大学问啦!在列表中经常见到下面这种形式:

list1=['aa',['bb',['cc',['dd','ee']]],'ff']

如果使用for循环迭代输出列表中的每个元素会得到下面的结果:

>>> list1=['aa',['bb',['cc',['dd','ee']]],'ff']
>>> for i in list1:
...    print(i)
...
aa
['bb', ['cc', ['dd', 'ee']]]
ff

可以看到,列表中嵌套的列表被整个当成一个元素输出了出来,那么该怎样做才能将嵌套的列表中的每个元素单独输出出来呢?

先看一下常规的实现方法——for循环嵌套。

>>> list1=['aa',['bb',['cc',['dd','ee']]],'ff']
>>> for i in list1:
...     if isinstance(i,list):
...         for a in i:
...             print(a)
...     else:
...         print(i)
...
aa
bb
['cc', ['dd', 'ee']]
ff

上面的例子中可以看到,使用for循环嵌套一层之后列表中的第一层嵌套的列表中的每个元素成功被输出出来了,但是第二层、第三层嵌套的列表中的每个元素依旧没有被依次输出。

这时候就需要用到for循环的多层嵌套了,但多层嵌套的for循环不仅写起来繁琐,读起来更要命。有没有其他更好的解决方法呢?当然有的——利用递归函数来轻松实现!

>>> list1=['aa',['bb',['cc',['dd','ee']]],'ff']
>>> def iteration(a):
...     for b in a:
...         if isinstance(b,list):
...             iteration(b)
...         else:
...             print(b)
...
>>> iteration(list1)
aa
bb
cc
dd
ee
ff

根据上面例子的输出可以看到,完美实现了要求的功能。本文仅仅演示下如何利用递归函数来解决此类问题,不对其做详细介绍。

Python小程序-写一个计算一元二次方程的程序函数

题目要求:

请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax^2 + bx + c = 0的两个解。

程序代码:

这只是一个函数,如果你不调用它的话,是不会产生任何输出的。

import math
def quadratic(a, b, c):
    if not (isinstance(a,(int,float)) and isinstance(b,(int,float)) and isinstance(c,(int,float))):
        return '请输入数字'
    else:
        d = -c + (b/2) ** 2
    if d < 0:
        return '无解'
    else:
        x1 = round((math.sqrt(d) - (b/2)) / a , 2)
        x2 = round((-math.sqrt(d) - (b/2)) / a , 2)
        return x1,x2

小结:

求数字的平方根可以使用math.sqrt()函数,需引入math模块。

Python小程序-根据用户输入的身高体重计算BMI值

题目要求:

请根据BMI公式(体重除以身高的平方)按照用户输入的身高体重计算BMI指数,并根据BMI指数:

  • 低于18.5:过轻
  • 18.5-25:正常
  • 25-28:过重
  • 28-32:肥胖
  • 高于32:严重肥胖

if-elif判断并打印结果。

代码:

height = float(input("请输入身高(单位,米):"))
weight = float(input("请输入体重(单位,公斤):"))
bmi = weight / (height ** 2)
if bmi < 18.5:
    print("过轻")
elif 18.5 <= bmi < 25:
    print("正常")
elif 25 <= bmi < 28:
    print("过重")
elif 28 <= bmi < 32:
    print("肥胖")
else:
    print("严重肥胖")

小结:

Python中求次方可以使用底数 ** 接指数,例如:求2的8次方,可以写成2 ** 8。

Python列表操作函数笔记

定义一个列表。

>>> abc=['a','b','c','d']

向列表尾部插入一个元素。

>>> abc.append('e')
>>> print(abc)
['a', 'b', 'c', 'd', 'e']

向列表中指定位置插入元素。

>>> abc.insert(2,'hi')
>>> print(abc)
['a', 'b', 'hi', 'c', 'd', 'e']

删除末尾元素。

>>> abc.pop()
>>> print(abc)
['a', 'b', 'hi', 'c', 'd']

删除指定的元素。

>>> abc.pop(2)
>>> print(abc)
['a', 'b', 'c', 'd']

Python小程序-计算并输出成绩提高的百分比

题目要求:

小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点,并用字符串格式化显示出’xx.x%’,只保留小数点后1位。

代码:

r = ((85 - 72)/72)*100
print('%2.1f%%' % r)

小结:

%2.1f代表格式化输出的浮点型字符串中,小数点前保留两位,小数点后保留一位,其中小数点前可省略不写,写成%.1f的形式也是可以的。