【Learning Python】【第四章】Python代码结构(一)
这一章的主旨在于介绍python的代码结构
缩进
在很多的编程语言中,一般{}用于控制代码块,比如以下的一段C代码
if(var <= 10)
{
printf(".....");
scanf(".....");
}
{}内部的代码被成为一个代码块(code block),当if的条件成立时,执行代码块内的内容
为了阅读的方便,程序员在写一个代码块的时候一般都会按下tab,形成缩进。
在python中,它认为反正你都要缩进了,不如不要打{}了,直接用缩进来表示代码块就好了
因此在python的if, while, for, def等语句的后面,都必须使用缩进来表示代码块
if x <= 10:
print(x)
x += 10;
上面的例子表示了缩进的作用
printf(x)是里属于if语句的代码快,只有if成立的时候才会被执行
而没有缩进的x += 10是全局代码块内的内容,是if外的代码,如果想要在if条件下才增加x的值,则写作如下:
if x <= 10:
print(x)
x += 10;
这样只有在if成立的条件下,x才会被增加10
python建议使用4个空格来表示一个缩进,而不是tab,特别更不是tab和空格的混用
条件判断:if elif else
这没什么可说的,注意与很多编程语言不一样的事,记得要写一个:
x = 10
if(x <= 0):
...
elif x > 10:
...
else
...
多个and语句进行简写
考虑你要写这么一个语句:
判断x <= 10,并且x >= y 并且y != 0,在一般的语言中你大概要这么写:
if(x <= 10 && x >= y && y !=0)
{
....
}
在python中,你可以直接这么写
0 != y <= x <=10
这个语句的意思是,判断0 != y 再判断 y <= x 再判断 x <= 10,多个用and条件进行关联的判断可以直接进行简写
形式化描述一点,就是(expr1) 判断 (expr2) 判断 (expr3) 判断 (expr4)...的时候,等价于
(expr1) 判断 (expr2) and (expr2) 判断 (expr3) and (expr3) 判断 (expr4)....
了解以上的判断规则,你就能发现以下一个判断x在1到5之间,而且x不能是4的代码为什么会输出True
x = 4
1 <= x <= 5 != 4
答案是:以上代码的执行是:1 <= x and x<= 5 and 5 !=4,因此是True没错
最后注意:判断一个玩意是不是None,用is,而不是 ==
判断循环:while
这也没什么好说的,需要注意的也是后面需要一个:,继续循环用continue,退出用break
和一般编程语言不一样的是,while能写else
i = 0
x = list[i]
while x in list and i < len(list):
find some thing.
if find:
break;
i += 1
x = list[i]
else:
print("not found")
循环被break掉了,则不会进入else,否则,如果你写了else,则进入else
这种特别适合你在一个列表找什么东西,找到了break,没找到自然循环结束,进入没找到的处理
迭代循环:for
和while不同,迭代循环的语法是:
for 变量 in 迭代目标:
迭代代码
else(可选):
for也能else,当for没有被break打断的时候,可以进入else的语句块
for对列表和元组和集合迭代都很简单,就是for item in target的模式
当对字典进行迭代的时候,则需要注意,如果你写成:
for x in dict:
那么你迭代的是字典的key
如果你只需要迭代value,则:
for v in dict.values():
如果你key/value都需要迭代,则:
for k, v in dict.items():
推导式:
推导式是python中很牛逼的一个玩意,它的主要作用在于缩短你的代码,更简洁的构建你的数据
思考这么一个例子:你需要构建一个列表,里面是1-1万的平方。在这种情况下,你可能需要这么写:
i = 1
l = []
while i <= 10000:
l.append(i ** 2)
i+=1
但是用上推导式,你只需要这么写:
l = [i ** 2 for i in range(1, 100001)]
推导式可以快速的组建列表、字段和集合,但不能用来形成元组
推导式的每一个for后面都能写if来附加格外条件,大致的格式是:
变量1 for 变量1 in 迭代1 if 条件1 if 条件2... 变量2 for 变量2 in 迭代2...
如果你觉得上面的式子晦涩难懂,那么我们来举这样一个例子:
创建一个列表,里面的所有元素是1-10的平方,但不能是3的倍数,而且不能是偶数,并且不在一个给定的集合内
s = {.....} #给定集合
l = [x ** 2 for x in range(1, 11) if x ** 2 % 3 !=0 if x ** 2 % 2 !=0 if x ** 2 not in s]
再来一个多循环多if的例子: 构建一个列表,里面的元素是一个元组(x, y),x满足以上条件,y满足从(1 - 100) 进行开方,且开方结果是整数,且不能是偶数的组合
s = {.....} #给定集合
l = [(x ** 2, y ** 0.5) for x in range(1, 11) if x ** 2 % 3 !=0 if x ** 2 % 2 !=0 if x ** 2 not in s for y in range(1, 101) if y ** 0.5 == int(y ** 0.5, 10) if y ** 0.5 % 2 != 0]
推导式内的变量名:
先来看这么一段让你崩溃的代码:
x = 3
{x:[(x, y) for y in range(x, 10) for x in range(1, 5)] for x in range(x + 1, 10) if x / ( x + 1) != 2}
试问,每一个x都是哪个x?
我们不妨将一个推导式抽象成两个部分: 待推导的表达式 + 推导表达式 + 判断条件
按照一般逻辑:
1. 要推导,则必须首先迭代推导表达式,在迭代的之前,首先要对被迭代的范围进行确定,因此in 后面的 x,必然是已经有值的才可以, 因此 in range(x + 1, 10)的时候有值的数据只有x = 3,因此这里相当于 in range(4, 10)
2. 迭代开始后,则待推导的变量就有了值,因此判断条件内的x是待推导变量,而不是外部的x = 3的
3. 同理应用到子推导,在推断前,需要对x, y的推导范围进行确定,这时y迭代条件的x明显需要取值,而最近的能取的值,就是外层迭代每次迭代完的x的值,因此这时每次子推导完成一次整体迭代后,下一次子推导的range x 的值都会变
推导式和元组 :
我不太理解为什么python不能从推导式生成元组
如果你执行以下的代码:
x = (y for y in range(1, 100))
你得到的不是一个元组,而是一个被称作生成器(generator)的玩意
生成器是python里面的一个类,它是可迭代的,当迭代完一次后,被迭代过的元素将被移出生成器
g = (x for x in range(1, 10))
for i in g:
if i == 5:
break
print(set(g))
输出的结果是{6, 7, 8, 9}, 而前面迭代的1,2,3,4,5已经被移出了生成器
因此对于生成器,你不妨这么理解,它就是一个列表,当迭代时,普通列表走下标,这个列表走pop,因此元素弹出后消失
【Learning Python】【第四章】Python代码结构(一)的更多相关文章
- 简学Python第四章__装饰器、迭代器、列表生成式
Python第四章__装饰器.迭代器 欢迎加入Linux_Python学习群 群号:478616847 目录: 列表生成式 生成器 迭代器 单层装饰器(无参) 多层装饰器(有参) 冒泡算法 代码开发 ...
- [Python学习笔记][第四章Python字符串]
2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...
- [Python笔记][第四章Python正则表达式]
2016/1/28学习内容 第四章 Python字符串与正则表达式之正则表达式 正则表达式是字符串处理的有力工具和技术,正则表达式使用预定义的特定模式去匹配一类具有共同特征的字符串,主要用于字符串处理 ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
- 孤荷凌寒自学python第四十二天python线程控制之Condition对象
孤荷凌寒自学python第四十二天python的线程同步之Condition对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天学习了Condition对象,发现它综合了Event对象 ...
- python的四种内置数据结构
对于每种编程语言一般都会规定一些容器来保存某些数据,就像java的集合和数组一样python也同样有这样的结构 而对于python他有四个这样的内置容器来存储数据,他们都是python语言的一部分可以 ...
- Python第四章-字典
第四章 字典-当索引不好用时 4.0 字典可以理解成是C++里的map,可以映射任何类型.字典这种结构类型称为映射(mapping). 字典是Python中唯一内建的映射类型,字典中的值并 ...
- 《Python CookBook2》 第四章 Python技巧 对象拷贝 && 通过列表推导构建列表
(先学第四章) 对象拷贝 任务: Python通常只是使用指向原对象的引用,并不是真正的拷贝. 解决方案: >>> a = [1,2,3] >>> import c ...
- Python第四章-流程控制
流程控制 在以前的代码中,所有的代码都是交由 Python 忠实地从头执行到结束.但是这些远远不够.很多时候需要根据不同的情况执行不同的代码. 如果你想改变这一工作流程,应该怎么做? 就像这样的情况: ...
- 【2】python核心编程 第四章-python对象
1.python对象 所有的Python 对像都拥有三个特性:身份,类型和值. 身份: 每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到. 这个值可以被认为是该对象的 ...
随机推荐
- 下载历史版本App超详细教程
有些时候我们需要下载旧版本的 App 进行研究或者其他用途,然而在 iOS 下,苹果的 App Store 里面默认只能下载最新版本的 App,对滴,就是这么任性,不服不行.然而在 Android 里 ...
- AJAX(一、基本知识)
AJAX:Asynchronous ([ə'sɪŋkrənəs; eɪ-])Javascript (['dʒɑ:və,skrɪpt])and XML 异步的Javascript和XMLAJAX不是新的 ...
- win7优化
- MySql学习(三) —— 子查询(where、from、exists) 及 连接查询(left join、right join、inner join、union join)
注:该MySql系列博客仅为个人学习笔记. 同样的,使用goods表来练习子查询,表结构如下: 所有数据(cat_id与category.cat_id关联): 类别表: mingoods(连接查询时作 ...
- nginx、Apache、IIS服务器解决 413 Request Entity Too Large问题方法汇总
一.nginx服务器 nginx出现这个问题的原因是请求实体太长了.一般出现种情况是Post请求时Body内容Post的数据太大了,如上传大文件过大.POST数据比较多. 处理方法 在nginx.co ...
- 立体角的单位——立体弧度(sr)
国际单位制(SI)中,关于物理量 发光强度 的介绍: 1cd(坎德拉)为一光源在给定方向的发光强度,该光源发出频率为540×1012Hz(赫兹)的单色辐射,且在此方向上的辐射强度为 1/683 W/s ...
- 关于arcengine中geoprocessor使用的困惑
最近在实验一个小功能,就是用arcengine10.1做一个小程序,将point类型的shp转换为polyline类型的shp文件,用到的工具是pointstoline,但就是在设置input_fea ...
- 【图像处理】【SEED-VPM】7.ubuntu10.04下 TFTP,NFS 安装指南
Linux系统启动流程 程序开发调试的一般方法 1. TFTP下载内核+NFS网络文件系统.即内核和文件系统均不在板卡上.主要用于调试内核功能. 2. FLASH启动内核+NFS网络文件系统,即内核固 ...
- Flapper Bird的学习笔记(三)
因为我有一个超屌的梦想,所以就绝不会做一个孬种的追梦人! 完成音效的添加 单例模式 游戏的状态切换 1. 单例模式 首先呢,说一下单例模式.何为单例?单例模式是一种常用的软件设计模式.在它的核心结构中 ...
- NOIP 2015 游记
本来和zly和wxh约好了 高三一起再来玩一次复赛,结果最终只有我一个人来了说...貌似是年段主任不让去...总算见识了比我们学校的YSD更爱管闲事的年段主任. 今年比赛竟然在衢州二中,学校不大,但感 ...