python基础整理(2)
布尔表达式与其余值的替换
值的测试
Python不仅仅可以使用布尔型变量作为条件,它可以直接在if中使用任何表达式作为条件:
大部分表达式的值都会被当作True,但以下表达式值会被当作False:
- False
- None
- 0
- 空字符串,空列表,空字典,空集合
循环
else语句
与 if 一样, while 和 for 循环后面也可以跟着 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__.pybar.py(defines func)baz.py(defines zap)
这意味着 foo 是一个包,我们可以这样导入其中的内容:
from foo.bar import func
from foo.baz import zap
bar 和 baz 都是 foo 文件夹下的 .py 文件。
导入包要求:
- 文件夹
foo在Python的搜索路径中 __init__.py表示foo是一个包,它可以是个空文件。
异常
try & except 块
一旦 try 块中的内容出现了异常,那么 try 块后面的内容会被忽略,Python会寻找 except 里面有没有对应的内容,如果找到,就执行对应的块,没有则抛出这个异常。
如:try 抛出的是 ValueError,except 中有对应的内容,所以这个异常被 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)的更多相关文章
- python基础整理----基本概念和知识
整理一下python的基本概念和知识, 主要用python3为语法标准. python介绍 一种面向对象的解释性计算机设计语言,具有丰富和强大的库. python定位:"优雅".& ...
- python基础整理笔记(九)
一. socket过程中注意的点 1. 黏包问题 所谓的黏包就是指,在TCP传输中,因为发送出来的信息,在接受者都是从系统的缓冲区里拿到的,如果多条消息积压在一起没有被读取,则后面读取时可能无法分辨消 ...
- python基础整理笔记(五)
一. python中正则表达式的一些查漏补缺 1. 给括号里分组的表达式加上别名:以便之后通过groupdict方法来方便地获取. 2. 将之前取名为"name"的分组所获得的 ...
- python基础整理笔记(四)
一. python 打开文件的方法 1. python中使用open函数打开文件,需要设定的参数包括文件的路径和打开的模式.示例如下: f = open('a.txt', 'r+') 2. f为打开文 ...
- python基础整理笔记(一)
一. 编码 1. 在python2里,加载py文件会对字符进行编码,需要在文件头上的注释里注明编码类型(不加则默认是ascII). # -*- coding: utf-8 -*- print 'hel ...
- python基础整理4——面向对象装饰器惰性器及高级模块
面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...
- python基础整理1
基础知识 名字与对象,类与类型 变量:在Python中,存储一个数据,需要一个叫做变量的东西 num2 = 87 #num2是一个变量 变量的类型: 程序中为了更充分的利用内存空间以及更有效率的管 ...
- python基础整理笔记(八)
一. python反射的方式来调用方法属性 反射主要指的就是hasattr.getattr.setattr.delattr这四个函数,作用分别是检查是否含有某成员.获取成员.设置成员.删除成员. 此外 ...
- python基础整理笔记(七)
一. python的类属性与实例属性的注意点 class TestAtt(): aaa = 10 def main(): # case 1 obj1 = TestAtt() obj2 = TestAt ...
- python基础整理笔记(三)
一. python的几种入参形式:1.普通参数: 普通参数就是最一般的参数传递形式.函数定义处会定义需要的形参,然后函数调用处,需要与形参一一对应地传入实参. 示例: def f(a, b): pri ...
随机推荐
- Java IO(十六)InputStreamReader 和 InputStreamWriter
Java IO(十六)InputStreamReader 和 InputStreamWriter 一.介绍 InputStreamReader 和 OutputStreamWriter 是字节流通向字 ...
- 一个 static 还能难得住我?
static 是我们日常生活中经常用到的关键字,也是 Java 中非常重要的一个关键字,static 可以修饰变量.方法.做静态代码块.静态导包等,下面我们就来具体聊一聊这个关键字,我们先从基础开始, ...
- ES6-json与字符串的转换
1.ES5下的json 1.1 基本概念 是对象 简写形式,名字跟值(key和value)一样,留一个就行 方法 :function一块删 即show:function(){...}等价于show() ...
- Rocket - tilelink - ErrorEvaluator
https://mp.weixin.qq.com/s/NkbW465NAmhDsETksd2M0g 介绍ErrorEvaluator的实现. 1. 基本介绍 ErrorEvalu ...
- Username for 'https://github.com': remote: Invalid username or password. fatal: Authentication failed for 'https://github.com/GLSmile/pythontest.git/' 问题
使用$ git push -u origin master 进行同步时,提示输入用户名和密码,但是我输入正确的信息后,仍然 会报Username for 'https://github.com': r ...
- MethodHandle(方法句柄)系列之二:方法句柄的简单使用
二话不说,上代码 /** * * @author LiuYeFeng<897908343@qq.com> * @date 2015年4月8日 下午10:41:13 * @CopyRigh ...
- Java实现基础练习十进制转十六进制
基础练习 十进制转十六进制 时间限制:1.0s 内存限制:512.0MB 提交此题 锦囊1 锦囊2 问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式.它有0,1,2,3,4,5,6, ...
- Java实现 蓝桥杯 算法训练 删除数组零元素
算法训练 删除数组零元素 时间限制:1.0s 内存限制:512.0MB 提交此题 从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移 ...
- Java实现 LeetCode 403 青蛙过河
403. 青蛙过河 一只青蛙想要过河. 假定河流被等分为 x 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有). 青蛙可以跳上石头,但是不可以跳入水中. 给定石子的位置列表(用单元格序 ...
- Java实现第八届蓝桥杯图形排版
标题:图形排版 小明需要在一篇文档中加入 N 张图片,其中第 i 张图片的宽度是 Wi,高度是 Hi. 假设纸张的宽度是 M,小明使用的文档编辑工具会用以下方式对图片进行自动排版: 1. 该工具会按照 ...