美文网首页
python输入输出、条件循环、异常处理进阶

python输入输出、条件循环、异常处理进阶

作者: D_w | 来源:发表于2021-10-18 18:04 被阅读0次

    输入输出

    • 输入的类型永远是字符串型;
    • 在对I/O 操作需谨慎,一定要进行充分的错误处理(类型转换时);
    • 通过read()读取文本内容,在文件较小时方便使用,在文件过大时可能造成内存崩溃,可以给read指定size,或用readline()每次读一行;
    • json数据和字典的区别可以理解为json就是将字典整体变为一个字符串类型,字符串内容为字典。json.dumps() 这个函数,接受 Python 的基本数据类型(字典),然后将其序列化为 string(json);而 json.loads() 这个函数,接受一个合法字符串(json),然后将其反序列化为 Python 的基本数据类型(字典)。

    条件循环

    • python中的数据结构只要是可迭代的(列表,集合,字符串等),都可以用以下方式遍历:
    for item in <iterable>:
        ...
    

    这里需要单独强调一下字典。字典本身只有键是可迭代的,如果我们要遍历它的值或者是键值对,就需要通过其内置的函数 values() 或者 items() 实现。其中,values() 返回字典的值的集合,items() 返回键值对的集合。

    d = {'name': 'jason', 'dob': '2000-01-01', 'gender': 'male'}
    for k in d: # 遍历字典的键
        print(k)
    name
    dob
    gender
    
    for v in d.values(): # 遍历字典的值
        print(v)
    jason
    2000-01-01
    male    
    
    for k, v in d.items(): # 遍历字典的键值对
        print('key: {}, value: {}'.format(k, v))
    key: name, value: jason
    key: dob, value: 2000-01-01
    key: gender, value: male 
    
    • 同时需要索引和元素时,还有一种更简洁的方式,那就是通过 Python 内置的函数 enumerate()。用它来遍历集合,不仅返回每个元素,并且还返回其对应的索引
    
    l = [1, 2, 3, 4, 5, 6, 7]
    for index, item in enumerate(l):
        if index < 5:
            print(item)  
    -------------------------------        
    1
    2
    3
    4
    5
    
    • continue的用法给定两个字典,分别是产品名称到价格的映射,和产品名称到颜色列表的映射。我们要找出价格小于 1000,并且颜色不是红色的所有产品名称和颜色的组合。如果不用 continue,代码应该是下面这样的:
    # name_price: 产品名称(str)到价格(int)的映射字典
    # name_color: 产品名字(str)到颜色(list of str)的映射字典
    for name, price in name_price.items():
        if price < 1000:
            if name in name_color:
                for color in name_color[name]:
                    if color != 'red':
                        print('name: {}, color: {}'.format(name, color))
            else:
                print('name: {}, color: {}'.format(name, 'None'))
    

    使用continue后:

    # name_price: 产品名称(str)到价格(int)的映射字典
    # name_color: 产品名字(str)到颜色(list of str)的映射字典
    for name, price in name_price.items():
        if price >= 1000:
            continue
        if name not in name_color:
            print('name: {}, color: {}'.format(name, 'None'))
            continue
        for color in name_color[name]:
            if color == 'red':
                continue
            print('name: {}, color: {}'.format(name, color))
    
    • range() 函数是直接由 C 语言写的,调用它速度非常快。而 while 循环中的“i += 1”这个操作,得通过 Python 的解释器间接调用底层的 C 语言,因此for range的效率高于while
    • 循环判断写作一行的方式:
    expression1 if condition else expression2 for item in iterable
    expression for item in iterable if condition  # 没有else语句
    

    相当于

    for item in iterable:
        if condition:
            expression1
        else:
            expression2
    

    给定下面两个列表 attributes 和 values,要求针对 values 中每一组子列表 value,输出其和 attributes 中的键对应后的字典,最后返回字典组成的列表。

    attributes = ['name', 'dob', 'gender']
    values = [['jason', '2000-01-01', 'male'], 
    ['mike', '1999-01-01', 'male'],
    ['nancy', '2001-02-01', 'female']
    ]
    
    # expected output:
    [{'name': 'jason', 'dob': '2000-01-01', 'gender': 'male'}, 
    {'name': 'mike', 'dob': '1999-01-01', 'gender': 'male'}, 
    {'name': 'nancy', 'dob': '2001-02-01', 'gender': 'female'}]
    
    # 一行完成
    print([dict(zip(attributes, value)) for value in values])
    

    异常处理

    • 异常处理,通常用在你不确定某段代码能否成功执行,也无法轻易判断的情况下,比如数据库的连接、读取等等。正常的 flow-control 逻辑,不要使用异常处理,直接用条件语句解决就可以了。
    • 无论发生什么情况,finally block 中的语句都会被执行,哪怕前面的 try 和 excep block 中使用了 return 语句。
    • 自定义异常类型
    class MyInputError(Exception):    # 继承Exception
        """Exception raised when there're errors in input"""
        def __init__(self, value): # 自定义异常类型的初始化
            self.value = value
        def __str__(self): # 自定义异常类型的string表达形式
            return ("{} is invalid input".format(repr(self.value)))
        
    try:
        raise MyInputError(1) # 抛出MyInputError这个异常
    except MyInputError as err:
        print('error: {}'.format(err))
    

    相关文章

      网友评论

          本文标题:python输入输出、条件循环、异常处理进阶

          本文链接:https://www.haomeiwen.com/subject/jdrnoltx.html