python学习笔记系列----(二)控制流
实际开始看这一章节的时候,觉得都不想看了,因为每种语言都会有控制流,感觉好像我不看就会了似的。快速预览的时候,发现了原来还包含了对函数定义的一些描述,重点讲了3种函数形参的定义方法,章节的最后讲述了PEP8的一些重要的规范,在学习的过程中还是学到了些知识。
2.1 if 语句
if语句就不多说了,经常跟else if .. 和 else ..一起使用,如下所示:
>>> x = int(raw_input("Please enter an integer: "))
Please enter an integer:
>>> if x < :
... x =
... print 'Negative changed to zero'
... elif x == :
... print 'Zero'
... elif x == :
... print 'Single'
... else:
... print 'More'
...
More
实际上elif 就是else if的缩写,这样缩写的原因是,python代码是采用缩进的方式,简写可以避免过度的缩进~~
2.2 for 语句
python的for跟C风格语言的for有很大的不一致,python的for可以遍历任何序列(列表或者字符串)的元素。比如一个list元素,现在要遍历list元素里的每个值,python可以如下操作:
words = ['cat', 'window', 'defenestrate'] for w in words:
print w
如果按照以前的思想,应该是这样的:
for i in range(len(words)):
print words[i]
在次基础上,如果现在需要做一些变更,比如words里面的长度大于6的字符串,复制该字符串到第一位,之后words就应该为['defenestrate','cat', 'window', 'defenestrate'],那会怎么实现呢?
# 方法1
for i in range(len(words)):
if len(words[i]) > :
words.insert(, words[i]) # 方法2
for w in words:
if len(w) > :
words.insert(,w) print words
方法1是以前常用的方法,方法2是python特有的方法,but~~~陷入死循环了~~.为啥呢?因为words在读到第3个字符串时,发现长度大于6,此时words又加了一个位,此时长度又增加了一位,这时for循环没有结束,又读了第四个字符串,又大于6,又在[0]下增加一位,因此无限循环了。罪魁祸首是words增加一位后,长度也增加了,那怎么不让其长度增加呢?嘿嘿,使用list的切片。list的切片实现了list对象的一个浅拷贝,意思就是list做切片的时候,复制了一份原内存的数据放到了一块新的内存中了(id(words)和id(words[:])内存地址是不一样的)。对list切片对象进行遍历,操作list原对象,所以即使list原对象的长度变化了也不会影响list切片的长度。
for w in words[:]:
if len(w) > :
words.insert(,w)
据此学习,总结出对list等可变对象进行循环遍历时,如果只进行读操作,可以正常使用;如果使用其他操作,特别是增加操作的时候,注意循环遍历的条件使用对象的切片进行操作。
2.3 range() 方法
range()方法的作用就是产生一个有序的数字,比如以下示例:
>>> range()
[, , , , , , , , , ]
>>> range(, )
[, , , , ]
>>> range(, , )
[, , , ]
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
... print i, a[i]
最后一种就是之前介绍的用C风格的方法遍历序列对象用的方法。
2.4 break 和 continue关键字
跟C语言一样,break的作用就是从跳出最近的for或者while循环。而continue的作用是继续当前循环的下一个迭代。在此就不列举例子了。
2.5 pass 关键字
pass关键字不做事情,一般放在一个需要body但是暂时却又未想好做神马的地方,如以下三个地方:
>>> while True:
... pass
>>> class MyEmptyClass:
... pass
>>> def initlog(*args):
... pass
2.6 定义函数
>>> def fib(n): # write Fibonacci series up to n
... """Print a Fibonacci series up to n."""
... a, b = ,
... while a < n:
... print a,
... a, b = b, a+b
...
>>> # Now call the function we just defined:
... fib()
函数的定义啰嗦了,关键字def就引入了一个函数的定义,值得注意的以下几点:
A. 函数体的第一行可以是一个可选的字符串,这个字符串是函数的文档字符串,称为docString,主要作用就是解释下这个函数的功能和使用,让调用者能方便的感知其作用,这个在后面会有详细介绍。同时这是一个好的编程习惯,应该保持。
B. 函数在执行的过程中会产生一张新的表用来存储函数的局部变量,在函数中所有的赋值都是将值存储在这个表中,函数的引用首先会查这个表,然后查上层函数的这个表,再是全局变量表,最后就去内置表中查找,函数调用实参实际就是从函数的局部变量表内查找其值,参数的传递始终是传值调用,这里的传值,指的是对象的引用,而不是对象的值。
C.上述示例中是没有return语句的,实际这类属于不带表达参数的return,函数执行完毕就会返回None。
2.7 函数形参的3种常用方式
2.7.1 默认参数
默认参数是指在函数定义的时,就给形参默认一个值,如果调用的时没有传递参数,则使用之前给的默认值。
def ask_ok(prompt, retries=, complaint='Yes or no, please!'):
pass
类似上面的函数,有2个默认参数,可以如下进行调用
ask_ok('Do you really want to quit?')
ask_ok('OK to overwrite the file?', )
ask_ok('OK to overwrite the file?', , 'Come on, only yes or no!')
官网有给出2个有趣的例子
i =
def f(arg=i):
print arg
i =
f()
这个打印多少呢?答案是当然是5,第一个i值属于函数定义域内的值,第二个i实际上已经是另一个i(两个i的id(i)是不同的),函数执行时,arg使用的默认值,就首先在函数的定义域内查找i,查到i的值是5.
l1 = [,,]
def f(li=l1):
print li
l1 = [,,3].append(4)
f()
这个又是打印多少呢?答案当然是1,2,3,4.因为第一个l1和第二个l1实际上指向的是同一块内存,后面已经修改了l1的值,所以打印出来的就是修改后的取值。
def f(a, L=[]):
L.append(a)
return L
print f()
print f()
print f()
而这个打印会是多少呢?依次是[1],[2],[3]?no,答案是[1],[1,2],[1,2,3],为啥呢?因为参数的默认只计算一次(传引用)。这使得默认值是可变的对象如列表、字典或大部分类的实例时会有所不同。函数在后续调用过程中会累积传给它的参数。可以修改如下:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
结论:使用默认参数时,注意默认参数的类型,最好是使用不可变参数做默认值,使用可变参数做默认值,第二次调用就会存在问题。
2.7.2 关键字参数
实际感觉关键字参数跟默认参数的定义较为类似,或者说是默认参数的一个升级版的形参列表。如上述例子中,retries和complaint也是关键字参数,函数调用时,关键字的参数必须跟随在必写参数的后面。传递的所有关键字参数必须与函数接受的某个参数相匹配,但关键字们之间的顺序并不重要。
当最后一个形参以**name的形式出现时,表示这个函数可以接受一个字典,里面可以包含没在形参列表中出现的所有关键字参数。以下是官网给的例子,附加了一个可变参数的使用。
def cheeseshop(kind, *arguments, **keywords):
print "-- Do you have any", kind, "?"
print "-- I'm sorry, we're all out of", kind
for arg in arguments:
print arg
print "-" *
keys = sorted(keywords.keys())
for kw in keys:
print kw, ":", keywords[kw] #以下3种调用方式均可
cheeseshop("Limburger", "It's very runny, sir.",
"It's really very, VERY runny, sir.",
shopkeeper='Michael Palin',
client="John Cleese",
sketch="Cheese Shop Sketch")
arguments=("It's very runny, sir.","It's really very, VERY runny, sir") keywords={shopkeeper='Michael Palin',client="John Cleese",sketch="Cheese Shop Sketch"}
cheeseshop("Limburger",arguments,keywords)
cheeseshop("Limburger",*arguments,**keywords)
2.7.3 可变参数
可变参数实际跟关键字参数的升级版有点类似,但是可变参数有个特点,就是参数个数是可变的。这也是一个最不常用的场景。这些参数被放在一个元组(见元组和序列)中。在可变个数的参数之前,可以有零到多个普通的参数。
2.7.4 参数列表的拆分
当传递的参数已经是一个列表或元组时,怎么处理呢? 难道手工一个个拆开,再传值?当然不是这样拆分的,python的函数调用时,可以使用 *-操作符将参数从列表或元组中分拆开来,使用**可以**-操作符让字典传递关键字参数
>>> range(, ) # normal call with separate arguments
[, , ]
>>> args = [, ]
>>> range(*args) # call with arguments unpacked from a list
[, , ]
>>> def parrot(voltage, state='a stiff', action='voom'):
... pass
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
2.7.5 文档字符串
下面例子中的pass前部分就是一个函数的文档字符串,查看python的标准库源码时经常能看见这样的格式。一般第一行是对函数用途简短、精确的总述。为了简单起见,不应该明确地声明对象的名字或类型,如果在文档字符串中有更多的行,第二行应该是空白,把摘要与剩余的描述分离开来。
>>> def my_function():
... """Do nothing, but document it.
...
... No, really, it doesn't do anything.
... """
... pass
...
>>> print my_function.__doc__
Do nothing, but document it.
No, really, it doesn't do anything.
2.8 编码风格
想让自己的代码对别人更易读,真不是一件容易做到的事情,需要养成良好的编码风格。对于 Python 而言, PEP 8 已成为大多数项目遵循的风格指南;官档提取出来的最重要的要点:
使用 4 个空格的缩进,不要使用制表符。
4 个空格是小缩进(允许更深的嵌套)和大缩进(易于阅读)之间很好的折衷。制表符会引起混乱,最好弃用。
折行以确保其不会超过 79 个字符。
这有助于小显示器用户阅读,也可以让大显示器能并排显示几个代码文件。
使用空行分隔函数和类,以及函数内的大块代码。
如果可能,注释独占一行。
使用文档字符串。
运算符周围和逗号后面使用空格,但是括号里侧不加空格: a = f(1, 2) + g(3, 4)。
命名您的类和函数一致 ;惯例是使用驼峰命名法命名类和使用lower_case_with_underscores 命名函数和方法 。始终使用self作为方法的第一个参数的名称(关于类和方法的更多信息请参见初识类)。
如果希望你的代码在国际化环境中使用,不要使用奇特的编码。简单的 ASCII 在任何情况下永远工作得最好。
最后一行,在python3的手册里看到提倡是使用unicode,嘿嘿,实际上,使用utf-8设置源码编码格式就能省很多事了~~~
python学习笔记系列----(二)控制流的更多相关文章
- Python学习笔记(二)——列表
Python学习笔记(二)--列表 Python中的列表可以存放任何数据类型 >>> list1 = ['Hello','this','is','GUN',123,['I','Lov ...
- 【Python学习笔记之二】浅谈Python的yield用法
在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...
- Python学习笔记(二):条件控制语句与循环语句及常用函数的用法
总结的内容: 1.条件控制语句 2.while循环语句 3.for循环语句 4.函数的用法 一.条件控制语句 1.介绍 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决 ...
- Python学习笔记(十二)—Python3中pip包管理工具的安装【转】
本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...
- python学习笔记系列----(一)python简介
一个月前,就按下决心要系统的学习下python了,虽然之前有学习过java,学习过c++,也能较为熟练的使用java做自动化测试看懂c++里的业务逻辑,但是实际上有那么多的东西自己还是不清楚,今天下定 ...
- Python学习笔记系列
1.小甲鱼 python 学习系列笔记
- Python基础笔记系列二:分支和循环
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 分支:即是if-else和if-elif-else语句 循环:即是whil ...
- python学习笔记系列----(八)python常用的标准库
终于学到了python手册的最后一部分:常用标准库.这部分内容主要就是介绍了一些基础的常用的基础库,可以大概了解下,在以后真正使用的时候也能想起来再拿出来用. 8.1 操作系统接口模块:OS OS模块 ...
- Python学习笔记(二)网络编程的简单示例
Python中的网络编程比C语言中要简洁很多,毕竟封装了大量的细节. 所以这里不再介绍网络编程的基本知识.而且我认为,从Python学习网络编程不是一个明智的选择. 简单的TCP连接 服务器代码如 ...
- Python学习笔记(二)使用Sublime Text编写简单的Python程序()
一.使用Sublime Text编写Python 1.点击“文件” →”新建文件“ 2.点击”文件“→”保存“,并保存为.py文件 此时已经创建好Python文件了,接下来就可以编写Python程序了 ...
随机推荐
- 在配置IIS负载均衡时,引起的一系列问题
问题一: IIS中要上传文件的路径是另一台服务器的地址(如:本机IP是192.168.0.100,文件保存的路径在://192.168.0.101/images/folder),在上传时抛出异常: A ...
- AJAX.JSONP 跨域
var Request = { timeout: 10 * 1000, // 10秒超时 status: 10, statusenum: { Wait: 10 ...
- petapoco定制,比较SQL事务,存储过程,分布式事务(MSDTC)的区别和场景
使用分布式事务时 就锁死了,而且是只锁编辑的行 使用.netSQL事务一定要执行了一个CUD的SQL才会锁死,而且也是锁行,但是也锁读的行 .netSQL事务要在这里才锁死 结论,对于产品要求细粒度的 ...
- C++ substr() 和 Java substring() 区别
Java和C++中都有关于子字符串的操作,C++中是substr(),Java中是substring(),两者的用法上稍有些区别,首先针对只有一个参数的情况: s.substr(start) 和 s. ...
- VMwareTools 安装(VMware Player)
1. VMare Tools 按钮是灰化的,需要对虚拟机做如下设置:(在虚拟机没有启动的状态下进行) 1)Player(P)->管理->虚拟机设置->CD/DVD 选择:使 ...
- Linux 根据组名查询出该组内所有成员
目前linux中没有直接根据组名查询组员的命令. 目前系统提供的查找组员和组之间的关系的方法有两种, 一种是:查找/etc/passwd和/etc/group目录,根据/etc/group目录里面的组 ...
- HTML静态网页 css样式表
CSS(Cascading Style Sheet,叠层样式表),作用是美化HTML网页. /*注释区域*/ 此为注释语法 一.样式表 (一)样式表的分类 1.内联样式表 和HTML联合显示,控 ...
- java容器学习
容器是java中重要的一部分,其接口的结构如下 Collection | ------------------ Map | | | Set List HashMap | HashSet 顾名思义,容器 ...
- DBHelper.java(数据库连接类)
package com.vcredit.ddcash.batch.util; import java.sql.Connection;import java.sql.DriverManager;impo ...
- 使用context来传递数据,一个context是一系列变量
页面设计工作和python代码分离,所以我们引用模板来实现这个功能. 一.模板实例 下面是一个模板的实例: [python]<html><head><title>O ...