1、os.path在不同的环境中设置文件的路径时作用非常大:
常用方法 | 作用 |
os.path.dirname(__file__) | 返回当前python执行脚本的执行路径(看下面的例子),这里__file__为固定参数 |
os.path.abspath(file) | 返回一个文件在当前环境中的绝对路径,这里file 一参数 |
os.path.join(basedir,file) | 将file文件的路径设置为basedir所在的路径,这里fbasedir和file都为参数 |
2、函数调用时带括号和不带括号的区别:
如函数:
#python3.5
def a(x):
return x
print(a) #不带括号调用的结果:<function a at 0x1091766a8>
print(a(3)) #带括号调用的结果:3
1、不带括号时,调用的是这个函数本身
2、带括号(此时必须传入需要的参数),调用的是函数的return结果
3、cPickle可以对任意一种类型的python对象进行序列化操作,比如list,dict,甚至是一个类的对象等。而所谓的序列化,我的粗浅的理解就是为了能够完整的保存并能够完全可逆的恢复。在cPickle中,主要有四个函数可以做这一工作,下面使用例子来介绍。
dump: 将python对象序列化保存到本地的文件。
>>> import cPickle
>>> data = range(1000)
>>> cPickle.dump(data,open("test\\data.pkl","wb"))dump函数需要指定两个参数,第一个是需要序列化的python对象名称,第二个是本地的文件,需要注意的是,在这里需要使用open函数打开一个文件,并指定“写”操作。
load:载入本地文件,恢复python对象
>>> data = cPickle.load(open("test\\data.pkl","rb"))
同dump一样,这里需要使用open函数打开本地的一个文件,并指定“读”操作
dumps:将python对象序列化保存到一个字符串变量中。
>>> data_string = cPickle.dumps(data)
loads:从字符串变量中载入python对象
>>> data = cPickle.loads(data_string)
4、python中read() readline()以及readlines()用法
我们谈到“文本处理”时,我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法: .read()、.readline() 和 .readlines()。每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。
5、python-enumerate枚举函数
enumerate 函数用于遍历序列中的元素以及它们的下标:
>>> for i,j in enumerate(('a','b','c')):
print i,j
0 a
1 b
2 c
>>> for i,j in enumerate([1,2,3]):
print i,j
0 1
1 2
2 3
g = lambda x:x+1
看一下执行的结果:
g(1)
>>>2
g(2)
>>>3
当然,你也可以这样使用:
lambda x:x+1(1)
>>>2
可以这样认为,lambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体,用函数来表示为:
1 def g(x):
2 return x+1
非常容易理解,在这里lambda简化了函数定义的书写形式。是代码更为简洁,但是使用函数的定义方式更为直观,易理解。
Python中,也有几个定义好的全局函数方便使用的,filter, map, reduce>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
>>>
>>> print filter(lambda x: x % 3 == 0, foo)
[18, 9, 24, 12, 27]
>>>
>>> print map(lambda x: x * 2 + 10, foo)
[14, 46, 28, 54, 44, 58, 26, 34, 64]
>>>
>>> print reduce(lambda x, y: x + y, foo)
139
lambda 定义了一个匿名函数
lambda 并不会带来程序运行效率的提高,只会使代码更简洁。
如果使用lambda,lambda内不要包含循环,如果有,最好定义函数来完成,使代码获得可重用性和更好的可读性。
7、dict()的操作方法
dict的很多方法跟list有类似的地方,下面一一道来,并且会跟list做一个对比
嵌套
嵌套在list中也存在,就是元素是list,在dict中,也有类似的样式:
>>> a_list
=
[[
1
,
2
,
3
],[
4
,
5
],[
6
,
7
]]
>>> a_list[
1
][
1
]
5
>>> a_dict
=
{
1
:{
"name"
:
"qiwsir"
},
2
:
"python"
,
"email"
:
"qiwsir@gmail.com"
}
>>> a_dict
{
1
: {
'name'
:
'qiwsir'
},
2
:
'python'
,
'email'
:
'qiwsir@gmail.com'
}
>>> a_dict[
1
][
'name'
]
#一个嵌套的dict访问其值的方法:一层一层地写出键
'qiwsir'
获取键、值
在上一讲中,已经知道可以通过dict的键得到其值。例上面的例子。
从上面的结果中,我们就可以看出,还可以用for语句循环得到相应内容。例如:
>>>
for
key
in
website.keys():
...
print
key,
type
(key)
...
1
<
type
'int'
>
second <
type
'str'
>
3
<
type
'int'
>
twitter <
type
'str'
>
>>>
#下面的方法和上面的方法是一样的
>>>
for
key
in
website:
...
print
key,
type
(key)
...
1
<
type
'int'
>
second <
type
'str'
>
3
<
type
'int'
>
twitter <
type
'str'
>
>>>
for
value
in
website.values():
...
print
value
...
google
baidu
facebook
4
>>>
for
key
in
website:
...
print
website[key]
...
google
baidu
facebook
4
>>>
for
k,v
in
website.items():
...
print
str
(k)
+
":"
+
str
(v)
...
1
:google
second:baidu
3
:facebook
twitter:
4
>>>
for
k
in
website:
...
print
str
(k)
+
":"
+
str
(website[k])
...
1
:google
second:baidu
3
:facebook
twitter:
4
>>> website
{
1
:
'google'
,
'second'
:
'baidu'
,
3
:
'facebook'
,
'twitter'
:
4
}
>>> website.get(
1
)
'google'
>>> website.get(
"second"
)
'baidu'
其它几种常用方法
>>>
len
(website)
4
>>> website
{
1
:
'google'
,
'second'
:
'baidu'
,
3
:
'facebook'
,
'twitter'
:
4
}
>>> new_web
=
website.copy()
#拷贝一份,这个拷贝也叫做浅拷贝,对应着还有深拷贝。
>>> new_web
#两者区别,可以google一下。
{
1
:
'google'
,
'second'
:
'baidu'
,
3
:
'facebook'
,
'twitter'
:
4
}
删除键值对的方法有两个,但是两者有一点区别
>>>
#d.pop(key),根据key删除相应的键值对,并返回该值
>>> new_web.pop(
'second'
)
'baidu'
>>>
del
new_web[
3
]
#没有返回值,如果删除键不存在,返回错误
>>> new_web
{
1
:
'google'
,
'twitter'
:
4
}
>>>
del
new_web[
9
]
Traceback (most recent call last):
File
"<stdin>"
, line
1
,
in
<module>
KeyError:
9
用d.update(d2)可以把d2合并到d中。
>>> cnweb
{
'qq'
:
'first in cn'
,
'python'
:
'qiwsir.github.io'
,
'alibaba'
:
'Business'
}
>>> website
{
1
:
'google'
,
'second'
:
'baidu'
,
3
:
'facebook'
,
'twitter'
:
4
}
>>> website.update(cnweb)
#把cnweb合并到website内
>>> website
#变化了
{
'qq'
:
'first in cn'
,
1
:
'google'
,
'second'
:
'baidu'
,
3
:
'facebook'
,
'python'
:
'qiwsir.github.io'
,
'twitter'
:
4
,
'alibaba'
:
'Business'
}
>>> cnweb
#not changed
{
'qq'
:
'first in cn'
,
'python'
:
'qiwsir.github.io'
,
'alibaba'
:
'Business'
}
8、Python中没有专门定义结构体的方法,但可以使用class标记定义类来代替结构体,
其成员可以在构造函数__init__中定义,具体方法如下。
def __init__(self):
self.name = '' # 名称
self.size = 10 # 尺寸
self.list = [] # 列表
a = item() # 定义结构对象
a.name = 'cup'
a.size = 8
a.list.append('water')