Python核心技术与实战
景霄
Facebook资深工程师
立即订阅
13891 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 从工程的角度深入理解Python
免费
基础篇 (14讲)
01 | 如何逐步突破,成为Python高手?
02 | Jupyter Notebook为什么是现代Python的必学技术?
03 | 列表和元组,到底用哪一个?
04 | 字典、集合,你真的了解吗?
05 | 深入浅出字符串
06 | Python “黑箱”:输入与输出
07 | 修炼基本功:条件与循环
08 | 异常处理:如何提高程序的稳定性?
09 | 不可或缺的自定义函数
10 | 简约不简单的匿名函数
11 | 面向对象(上):从生活中的类比说起
12 | 面向对象(下):如何实现一个搜索引擎?
13 | 搭建积木:Python 模块化
14 | 答疑(一):列表和元组的内部实现是怎样的?
进阶篇 (11讲)
15 | Python对象的比较、拷贝
16 | 值传递,引用传递or其他,Python里参数是如何传递的?
17 | 强大的装饰器
18 | metaclass,是潘多拉魔盒还是阿拉丁神灯?
19 | 深入理解迭代器和生成器
20 | 揭秘 Python 协程
21 | Python并发编程之Futures
22 | 并发编程之Asyncio
23 | 你真的懂Python GIL(全局解释器锁)吗?
24 | 带你解析 Python 垃圾回收机制
25 | 答疑(二):GIL与多线程是什么关系呢?
规范篇 (7讲)
26 | 活都来不及干了,还有空注意代码风格?!
27 | 学会合理分解代码,提高代码可读性
28 | 如何合理利用assert?
29 | 巧用上下文管理器和With语句精简代码
30 | 真的有必要写单元测试吗?
31 | pdb & cProfile:调试和性能分析的法宝
32 | 答疑(三):如何选择合适的异常处理方式?
量化交易实战篇 (8讲)
33 | 带你初探量化世界
免费
34 | RESTful & Socket: 搭建交易执行层核心
35 | RESTful & Socket: 行情数据对接和抓取
36 | Pandas & Numpy: 策略与回测系统
免费
37 | Kafka & ZMQ:自动化交易流水线
38 | MySQL:日志和数据存储系统
39 | Django:搭建监控平台
40 | 总结:Python中的数据结构与算法全景
技术见闻与分享 (4讲)
41 | 硅谷一线互联网公司的工作体验
42 | 细数技术研发的注意事项
加餐 | 带你上手SWIG:一份清晰好用的SWIG编程实践指南
43 | Q&A:聊一聊职业发展和选择
结束语 (1讲)
结束语 | 技术之外的几点成长建议
Python核心技术与实战
登录|注册

07 | 修炼基本功:条件与循环

景霄 2019-05-24
你好,我是景霄。
前面几节,我们一起学习了列表、元祖、字典、集合和字符串等一系列 Python 的基本数据类型。但是,如何把这一个个基本的数据结构类型串接起来,组成一手漂亮的代码呢?这就是我们今天所要讨论的“条件与循环”。
我习惯把“条件与循环”,叫做编程中的基本功。为什么称它为基本功呢?因为它控制着代码的逻辑,可以说是程序的中枢系统。如果把写程序比作盖楼房,那么条件与循环就是楼房的根基,其他所有东西都是在此基础上构建而成。
毫不夸张地说,写一手简洁易读的条件与循环代码,对提高程序整体的质量至关重要。

条件语句

首先,我们一起来看一下 Python 的条件语句,用法很简单。比如,我想要表示 y=|x|这个函数,那么相应的代码便是:
# y = |x|
if x < 0:
y = -x
else:
y = x
和其他语言不一样,我们不能在条件语句中加括号,写成下面这样的格式。
if (x < 0)
但需要注意的是,在条件语句的末尾必须加上冒号(:),这是 Python 特定的语法规范。
由于 Python 不支持 switch 语句,因此,当存在多个条件判断时,我们需要用 else if 来实现,这在 Python 中的表达是 elif。语法如下:
if condition_1:
statement_1
elif condition_2:
statement_2
...
elif condition_i:
statement_i
else:
statement_n
整个条件语句是顺序执行的,如果遇到一个条件满足,比如 condition_i 满足时,在执行完 statement_i 后,便会退出整个 if、elif、else 条件语句,而不会继续向下执行。这个语句在工作中很常用,比如下面的这个例子。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Python核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(129)

  • yshan
    [(xx, yy) for xx in x for yy in y if x != y]
    应该是 if xx != yy] 吧
    思考题一行:
    [dict(zip(attributes,v)) for v in values]



    作者回复: 嗯嗯,笔误已更新。
    思考题👍

    2019-05-24
    60
  • AllenGFLiu
    思考题
    一行版:
    [dict(zip(attributes, value)) for value in values]

    循环版:
    l = []
    for value in values:
        d = {}
        for i in range(3):
            d[attributes[i]] = value[i]
        l.append(d)


    2019-05-25
    1
    30
  • LiANGZE
    课后的练习题,手机打的,格式可能不好看

    print( [{ attributes[i]: value[i] for i in range(len(attributes)) } for value in values])
    2019-05-24
    23
  • Fergus
    # Ask
    attributes = ['name', 'dob', 'gender']
    values = [['jason', '2000-01-01', 'male'],
              ['mike', '1999-01-01', 'male'],
              ['nancy', '2001-02-01', 'female']]
    # Answers1
    lis = []
    for i in values:
        print(i)
        print(dict(zip(attributes, i)))
        print(lis.append(dict(zip(attributes, i))))
    # Answers2
    [dict(zip(attributes, i)) for i in values]
    # Answers3
    list(map(lambda x: dict(zip(attributes, x)), values))
    # Answers4
    lis = []
    for i in values:
        dic = {}
        for n, j in enumerate(i):
            dic[attributes[n]] = j
        lis.append(dic)
    print(lis)

    我没有想到用多行条件循环语句实现的方法。先留言,然后看别人怎么做的。
    2019-05-26
    13
  • Deed
    [dict(zip(attributes, value)) for value in values]
    2019-05-24
    8
  • 呜呜啦
    attributes = ['name', 'dob', 'gender']
    values = [
    ['jason', '2000-01-01', 'male'],
    ['mike', '1999-01-01', 'male'],
    ['nancy', '2001-02-01', 'female']
    ]

    # 多行代码版
    list1 = [] # 建立空列表
    for value in values: # 对值列表进行循环
        dict1 = {} # 建立空字典,方便后续字典键值对存储
        for index,key in enumerate(attributes): # 遍历键列表,返回元素与索引
            dict1[key] = value[index] # 键与值配对,组装成字典元素
        list1.append(dict1) # 将新字典添加到里列表中
    print(list1) # 打印显示出完整列表

    # 一行代码版
    [{key:value[index] for index,key in enumerate(attributes)}for value in values]
    # 最外层[]与上面“list1=[]”和“list1.append(dict1)”等价
    # "{key:value[index] for index,key in enumerate(attributes)}"与上面"for value in values:"内代码等价
    # 体会:先梳理逻辑,写出多行代码版,再回溯写出一行代码版,体现出Python的简洁优美
    2019-06-15
    2
    7
  • 武林秀才
    一行的
    [dict([(attributes[j],values[i][j]) for j in range(len(attributes))]) for i in range(len(values))]
    2019-05-28
    4
  • Wing·三金
    # 多行版本
    combined = []
    for value in values:
        temp_dict = {}
        for index, attr in enumerate(attributes):
            temp_dict[attr] = value[index]
        combined.append(temp_dict)

    combined

    # 单行版本
    [{attr: value[index] for index, attr in enumerate(attributes)} for value in values]
    2019-05-27
    3
  • 敏杰
    [dict(map(lambda x, y:(x, y), attributes, value)) for value in values]
    2019-05-27
    3
  • k8scloud
    attributes = ['name','dob','gender']
    values = [['jason','2000-1-01','male'],['mike','1999-01-1','male'],['nancy','201-02-01','female']]
    output = []
    for v in values:
        dst = {}
        for k in range(len(v)):
            dst[attributes[k]] = v[k]
        output.append(dst)
    print(output)
    2019-05-26
    3
  • 隰有荷
    zip函数感觉好神奇,得差一下,哈哈
    2019-06-08
    2
  • 夜下凝月
    Python中没有switch,但是可以用字典来代替。
    #不调用函数
    level = {0:'red', 1:'yellow', 2:'green'}
    try:
        level(id)
    except:
        pass

    #需要调用函数
    def delete (id):
        '''delete the movie that id is 0'''
    ………
        ………
    ………
        ………
    opt = {0:delete, 1:warning, 2:allow}

    opt[ id ]( id )
    2019-05-25
    2
  • 小希
    通过反复查看文章内容跟参考留言中的评论,理解后输出。
    虽然不是自己写的,也算是对自己的一种鼓励,至少清楚了逻辑。
    #一行
    print ([dict(zip(attributes,value))for value in values])

    #多行输出
    list1 = [] #建议空列表
    for value in values: #对值列表进行循环
        dict1 = {} #简历空字典,后续对字典键值对存储
        for index ,key in enumerate(attributes):#遍历建列表,返回索引与元素
            dict1[key] = value[index] #键与值匹配对,组装成字典元素
        list1.append(dict1) #将字典添加到列表中
    print(list1)

    作者回复: 加油

    2019-11-27
    1
  • 夜雨声烦
    作业:使用zip函数将两个list聚合成一个元祖,然后再转换成字典:
    bb = [dict(zip(attributes,va)) for va in values]
    2019-09-17
    1
  • 易拉罐
    # general.
    expected_output = []
    for v in values:
        expected_output.append(dict(zip(attributes, v)))
    print(expected_output)

    # one line
    print([dict(zip(attributes, v)) for v in values])
    2019-06-03
    1
  • 夏秋冬的春天
    # 多行
    output_dist = []
    for v in values:
        dict_at = {}
        for i in range(len(attributes)):
            dict_at[attributes[i]] = v[i]
        output_dist.append(dict_at)
    print(output_dist)

    # 一行
    print( [{ attributes[i]: value[i] for i in range(len(attributes)) } for value in values])
    2019-05-31
    1
  • Geek_d848f7
    #多行
    res=[]
    for value in values:
        if len(attributes)!=len(value):
            continue
        temp={}
        for index,each in enumerate(value):
            temp[attributes[index]]=each
        res.append(temp)
    print(res)

    #使用zip
    s=[dict(zip(attributes,value)) for value in values if len(attributes)==len(value)]
    2019-05-29
    1
  • taoist
    一行: [dict(zip(attributes, value)) for value in values]
    多行:
    l = []
    for value in values:
        d = {}
        for i,j in zip(attributes, value):
            d[i] = j
        l.append(d)
    2019-05-26
    1
  • catshitfive
    写个长的吧
    def get_list_dicts(attribs,vals):
        result=[]
        for l in values:
            temp_dict={}
            if len(l)==len(attributes):
                for i in range(len(attributes)):
                    temp_dict[attributes[i]]=l[i]
            else:
                print('values列表中第{}组内值的个数'
                      '需与属性列表内的个数保持一致!'.format(values.index(l)+1))
                return None
            result.append(temp_dict)
        return result
    2019-05-24
    1
  • 力维
    思考题:
    多行
    lst = []
    for v in values:
        d = {}
        for i,a in enumerate(attributes):
            d[a] = v[i]
        lst.append(d)

    单行
    [{a:v[i] for i,a in enumerate(attributes)} for v in values]
    2019-12-02
收起评论
99+
返回
顶部