布尔表达式与其余值的替换

值的测试

Python不仅仅可以使用布尔型变量作为条件,它可以直接在if中使用任何表达式作为条件:

大部分表达式的值都会被当作True,但以下表达式值会被当作False

  • False
  • None
  • 0
  • 空字符串,空列表,空字典,空集合

循环

else语句

if 一样, whilefor 循环后面也可以跟着 else 语句,不过要和break一起连用。

  • 当循环正常结束时,循环条件不满足, else 被执行;
  • 当循环被 break 结束时,循环条件仍然满足, else 不执行。
values = [7, 6, 4, 7, 19, 2, 1]
for x in values:
if x <= 10:
print 'Found:', x
break
else:
print 'All values greater than 10'

xrange函数

total = 0
for i in range(100000):
total += i
print total
4999950000

然而这种写法有一个缺点:在循环前,它会生成一个长度为 100000 的临时列表。

生成列表的问题在于,会有一定的时间和内存消耗,当数字从 100000 变得更大时,时间和内存的消耗会更加明显。

为了解决这个问题,我们可以使用 xrange 来代替 range 函数,其效果与range函数相同,但是 xrange 并不会一次性的产生所有的数据:

total = 0
for i in xrange(100000):
total += i
print total
4999950000

列表推导式

values = [10, 21, 4, 7, 12]
squares = [x**2 for x in values]
print squares
[100, 441, 16, 49, 144]

还可以在列表推导式中加入条件进行筛选。 例如在上面的例子中,假如只想保留列表中不大于10的数的平方:

values = [10, 21, 4, 7, 12]
squares = [x**2 for x in values if x <= 10]
print squares
[100, 16, 49]

也可以使用推导式生成集合和字典

square_set = {x**2 for x in values if x <= 10}
print(square_set)
square_dict = {x: x**2 for x in values if x <= 10}
print(square_dict) set([16, 49, 100])
{10: 100, 4: 16, 7: 49}

再如,计算上面例子中生成的列表中所有元素的和:

total = sum([x**2 for x in values if x <= 10])
print(total)
165

但是,Python会生成这个列表,然后在将它放到垃圾回收机制中(因为没有变量指向它),这毫无疑问是种浪费。

为了解决这种问题,与xrange()类似,Python使用产生式表达式来解决这个问题:

total = sum(x**2 for x in values if x <= 10)
print(total)
165

与上面相比,只是去掉了括号,但这里并不会一次性的生成这个列表。

函数

接收不定参数

def add(x, *args):
total = x
for arg in args:
total += arg
return total

这里,*args 表示参数数目不定,可以看成一个元组,把第一个参数后面的参数当作元组中的元素。

这样定义的函数不能使用关键词传入参数,要使用关键词,可以这样:

def add(x, **kwargs):
total = x
for arg, value in kwargs.items():
print "adding ", arg
total += value
return total

这里, ** kwargs 表示参数数目不定,相当于一个字典,关键词和值对应于键值对。

print add(10, y=11, z=12, w=13)
adding y
adding z
adding w
46

再看这个例子,可以接收任意数目的位置参数和键值对参数:

def foo(*args, **kwargs):
print args, kwargs foo(2, 3, x='bar', z=10)
(2, 3) {'x': 'bar', 'z': 10}

不过要按顺序传入参数,先传入位置参数 args ,在传入关键词参数 kwargs

返回多个值

函数可以返回多个值:

事实上,Python将返回的两个值变成了元组:

print to_polar(3, 4)
(5.0, 0.9272952180016122)

因为这个元组中有两个值,所以可以给两个值赋值。

列表也有相似的功能:

a, b, c = [1, 2, 3]
print a, b, c
1 2 3

事实上,不仅仅返回值可以用元组表示,也可以将参数用元组以这种方式传入:

def add(x, y):
"""Add two numbers"""
a = x + y
return a z = (2, 3)
print add(*z)
5

这里的*必不可少。

还可以通过字典传入参数来执行函数:

def add(x, y):
"""Add two numbers"""
a = x + y
return a w = {'x': 2, 'y': 3}
print add(**w)
5

map 方法生成序列

可以通过 map 的方式利用函数来生成序列:

def sqr(x):
return x ** 2 a = [2,3,4]
print map(sqr, a)
[4, 9, 16]

其用法为:

map(aFun, aSeq)

将函数 aFun 应用到序列 aSeq 上的每一个元素上,返回一个列表,不管这个序列原来是什么类型。

事实上,根据函数参数的多少,map 可以接受多组序列,将其对应的元素作为参数传入函数:

def add(x, y):
return x + y a = (2,3,4)
b = [10,5,3]
print map(add,a,b)
[12, 8, 7]

模块和包

在导入时,Python会执行一遍模块中的所有内容。

ex1.py 中所有的变量都被载入了当前环境中,不过要使用

ex1.变量名  的方法来查看或者修改这些变量
ex1.函数名 调用模块里面的函数:

为了提高效率,Python只会载入模块一次,已经载入的模块再次载入时,Python并不会真正执行载入操作,哪怕模块的内容已经改变。 需要重新导入模块时,可以使用reload强制重新载入它

_name__ 属性

有时候我们想将一个 .py 文件既当作脚本,又能当作模块用,这个时候可以使用 __name__ 这个属性。

只有当文件被当作脚本执行的时候, __name__的值才会是 '__main__',所以我们可以:

%%writefile ex2.y

PI = 3.1416

def test():
w = [0,1,2,3]
print 'test passed.' if __name__ == '__main__':
test()

假设我们有这样的一个文件夹:

foo/

  • __init__.py
  • bar.py (defines func)
  • baz.py (defines zap)

这意味着 foo 是一个包,我们可以这样导入其中的内容:

from foo.bar import func
from foo.baz import zap

barbaz 都是 foo 文件夹下的 .py 文件。

导入包要求:

  • 文件夹 fooPython的搜索路径中
  • __init__.py 表示 foo 是一个包,它可以是个空文件。

异常

try & except 块

一旦 try 块中的内容出现了异常,那么 try 块后面的内容会被忽略,Python会寻找 except 里面有没有对应的内容,如果找到,就执行对应的块,没有则抛出这个异常。

如:try 抛出的是 ValueErrorexcept 中有对应的内容,所以这个异常被 except 捕捉到,程序可以继续执行

finally

try/catch 块还有一个可选的关键词 finally。

不管 try 块有没有异常, finally 块的内容总是会被执行,而且会在抛出异常前执行,因此可以用来作为安全保证,比如确保打开的文件被关闭

在抛出异常前执行, 如果异常被捕获了,在最后执行。

文件读写

写入测试文件:

%%writefile test.txt
this is a test fileS.
hello world!
python is good!
today is a good day. Writing test.txt

读文件

使用 open 函数或者 file 函数来读文件,使用文件名的字符串作为输入参数:这两种方式没有太大区别。

f = open('test.txt')

f = file('test.txt')

默认以读的方式打开文件,如果文件不存在会报错。

可以使用 read 方法来读入文件中的所有内容:

text = f.read()
print text this is a test file.
hello world!
python is good!
today is a good day.

也可以按照行读入内容readlines 方法返回一个列表,每个元素代表文件中每一行的内容:

f = open('test.txt')
lines = f.readlines()
print lines ['this is a test file.\n', 'hello world!\n', 'python is good!\n', 'today is a good day.']

使用完文件之后,需要将文件关闭。

f.close()

事实上,我们可以将 f 放在一个循环中,得到它每一行的内容:

写文件

我们使用 open 函数的写入模式来写文件:

f = open('myfile.txt', 'w')
f.write('hello world!')
f.close()

使用 w 模式时,如果文件不存在会被创建,我们可以查看是否真的写入成功:

如果文件已经存在, w 模式会覆盖之前写的所有内容:

除了写入模式,还有追加模式 a ,追加模式不会覆盖之前已经写入的内容,而是在之后继续写入:

写入结束之后一定要将文件关闭,否则可能出现内容没有完全写入文件中的情况。

还可以使用读写模式 w+

f = open('myfile.txt', 'w+')
f.write('hello world!')
f.seek(6)
print f.read()
f.close()
world!

二进制文件

二进制读写模式 b:

import os
f = open('binary.bin', 'wb')
f.write(os.urandom(16))
f.close() f = open('binary.bin', 'rb')
print repr(f.read())
f.close()
'\x86H\x93\xe1\xd8\xef\xc0\xaa(\x17\xa9\xc9\xa51\xf1\x98'

换行符

不同操作系统的换行符可能不同:

  • \r
  • \n
  • \r\n

使用 U 选项,可以将这三个统一看成 \n 换行符。

关闭文件

Python中,如果一个打开的文件不再被其他变量引用时,它会自动关闭这个文件。

所以正常情况下,如果一个文件正常被关闭了,忘记调用文件的 close 方法不会有什么问题。

关闭文件可以保证内容已经被写入文件,而不关闭可能会出现意想不到的结果:

with 方法

Python提供了更安全的方法,当 with 块的内容结束后,Python会自动调用它的close 方法,确保读写的安全:

with open('newfile.txt','w') as f:
for i in range(3000):
x = 1.0 / (i - 1000)
f.write('hello world: ' + str(i) + '\n') ---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-24-9d2a70065b27> in <module>()
1 with open('newfile.txt','w') as f:
2 for i in range(3000):
----> 3 x = 1.0 / (i - 1000)
4 f.write('hello world: ' + str(i) + '\n') ZeroDivisionError: float division by zero

try/exception/finally 效果相同,但更简单。

python基础整理(2)的更多相关文章

  1. python基础整理----基本概念和知识

    整理一下python的基本概念和知识, 主要用python3为语法标准. python介绍 一种面向对象的解释性计算机设计语言,具有丰富和强大的库. python定位:"优雅".& ...

  2. python基础整理笔记(九)

    一. socket过程中注意的点 1. 黏包问题 所谓的黏包就是指,在TCP传输中,因为发送出来的信息,在接受者都是从系统的缓冲区里拿到的,如果多条消息积压在一起没有被读取,则后面读取时可能无法分辨消 ...

  3. python基础整理笔记(五)

    一. python中正则表达式的一些查漏补缺 1.  给括号里分组的表达式加上别名:以便之后通过groupdict方法来方便地获取. 2.  将之前取名为"name"的分组所获得的 ...

  4. python基础整理笔记(四)

    一. python 打开文件的方法 1. python中使用open函数打开文件,需要设定的参数包括文件的路径和打开的模式.示例如下: f = open('a.txt', 'r+') 2. f为打开文 ...

  5. python基础整理笔记(一)

    一. 编码 1. 在python2里,加载py文件会对字符进行编码,需要在文件头上的注释里注明编码类型(不加则默认是ascII). # -*- coding: utf-8 -*- print 'hel ...

  6. python基础整理4——面向对象装饰器惰性器及高级模块

    面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...

  7. python基础整理1

    基础知识 名字与对象,类与类型 变量:在Python中,存储一个数据,需要一个叫做变量的东西   num2 = 87 #num2是一个变量 变量的类型: 程序中为了更充分的利用内存空间以及更有效率的管 ...

  8. python基础整理笔记(八)

    一. python反射的方式来调用方法属性 反射主要指的就是hasattr.getattr.setattr.delattr这四个函数,作用分别是检查是否含有某成员.获取成员.设置成员.删除成员. 此外 ...

  9. python基础整理笔记(七)

    一. python的类属性与实例属性的注意点 class TestAtt(): aaa = 10 def main(): # case 1 obj1 = TestAtt() obj2 = TestAt ...

  10. python基础整理笔记(三)

    一. python的几种入参形式:1.普通参数: 普通参数就是最一般的参数传递形式.函数定义处会定义需要的形参,然后函数调用处,需要与形参一一对应地传入实参. 示例: def f(a, b): pri ...

随机推荐

  1. Kafka SSL安装与配置

    1.概述 最近有同学咨询说,Kafka的SSL安全认证如何安装与使用?今天笔者将通过以下几个方面来介绍Kafka的SSL: Kafka 权限介绍 Kafka SSL的安装与使用 Kafka Eagle ...

  2. Thinkphp5 post提交模糊查询带分页如何保留参数

    最近做了一个分页的模糊查询post请求,发现查出来的分页点击下一页导致所有的搜索条件被重置,分页效果就失效了. 以下是网上部分解决办法: 控制器代码 public function index($na ...

  3. WordPress美化百度分享默认图标

    因代码中使用了Font Awesome字体图标,如果你的主题没有加载字体图标,可以到WP后台--插件--安装插件页面搜索:Font Awesome 4 Menus 安装并启用,才能显示替换后的图标. ...

  4. 使用net Manager工具远程连接Oracle配置监听

    一.在服务端配置Oracle端口 win + R 输入netca 弹出如下窗口后 选择监听程序配置,点击下一步: 二.配置端口号后使用Telnet工具调试端口是否连通 在命令行输入telnet 服务器 ...

  5. 此flash player与您的地区不相容——更换新版本edge后出现的问题

    最新切换到了edge浏览器,使用flash时提示:"此flash player与您的地区不相容",而chrome是没有问题的.网上找到解决方案,发现一个可以有效解决的方式,如下: ...

  6. 【jQuery】全功能轮播图的实现(本文结尾也有javascript版)

    轮播图 图片自动切换(定时器): 鼠标悬停在图片上图片不切换(清除定时器) 鼠标悬停在按钮上时显示对应的图片(鼠标悬停事件) 鼠标悬停在图片上是现实左右箭头 点击左键切换到上一张图片,但图片为第一张时 ...

  7. css引入方式和基本样式

    css的三种引入方式: 1.内嵌:直接在标签中添加style属性 格式:<标签名 style="样式1:样式值1:样式2=样式值2:"></标签名> 2.内 ...

  8. JavaScript (五) js的基本语法 - - - 面向对象、工程模式、内置对象、JSON

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.编程思想 1.定义: 编程思想:把一些生活中做事的经验融入到程序中 面向过程:凡事都要亲力亲为,每件 ...

  9. svg高级应用及动画

    canvas 和 webGL 这两项图形技术结合 css3 可以说能完成绝大部分的动画和需求.但 canvas 和 webGL 毕竟是偏向底层的绘制引擎,某些场景使用起来还是过于繁琐的,不分场合一律使 ...

  10. Java实现 LeetCode 1013 将数组分成和相等的三个部分

    1013. 将数组分成和相等的三个部分 给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果可以找出索引 i+1 < j 且满足 ...