python成长记(一)
蜗牛之前是学过一点python的,不过只是学过而已看,时间长不用基本多忘了。
为了做毕设,要学习flask框架,觉得最好还是把python再过一遍。
可能觉得蜗牛东一头西一头的,看的东西太多。可是蜗牛有什么办法,我也很绝望啊!
还是静下心来看书吧,蜗牛会住上别墅的,蜗牛会开上豪车的……
——————我是华丽的分割线————-——————————
1.一个.py文件就是一个python模块(多数情况下)。有的时候,一个文件中包含多个模块。
2.导入模块的两种方式:
第一种:
>>>import myfile
>>>print myfile.title
上面是把文件整个的导入了
第二种:
>>>from myfile import title
>>>print title
from的本质其实是拷贝。
3.python有很多内置的对象。而且大多数情况下,内置对象都比自己写的对象好用。像int这种东西在python中是对象。
4.自己设计对象的时候,通常建立在列表和字典之上。因为python是脚本语言,你别指望他和c++比肩。
python中的内置对象
python是一种弱类型语言,可能学过c++的童鞋总是会不自觉地强加类型的概念。
比如:
haha=123
总有刁民觉得haha是个int类型的变量。
python:你开心就好,我无所谓。
python的内置对象:
Number(数字) 123,3.14,,999L
String(字符串)
List(列表)
Dictionary(字典)
Tuple(元组)
File(文件)
第一个要学习的内置对象就是
数字
这个其实没啥讲的,讲了也都是概念性的问题,具体用的时候再说。
python针对数字对象还提供了一系列的内置函数和模块,如:
- pow,abs内置数学函数
- rand,math内置的模块。
- 学好内置模块是一件非常有用的事情
内置模块的使用栗子
>>>import math #注意这句话,使用math这样的内置模块一定要导入。
#但是使用abs()这样的内置函数就不用导入了,因为在名字空间中。
>>>math.pi
3.141925653
>>>abs(-42)
python的表达式操作和预处理
- lambda args:匿名函数
- is,not is:身份测试,(identity,即地址)
- in,not in(在不在一个序列中)
- 其实和Java中提供的String对象有点儿像。
- python中没有char类型。一个string随便。
string 字符串
python字符串支持分片啊啥的,有很灵活的用法。
其实String表示的是被称为序列的对象的较大的类。
字符串支持分片slice,索引index,合并等等。regex和re模块为字符串添加了正则表达式的匹配。
这个操作:
>>> name="Simon"
>>>name*3
>上面的代码是将name输出了三次。
>>>len(name)
>输出长度
>>>"abc"+"cde"
>合并字符串
>为什么我总觉得迭代和遍历是一样的?
>>>myjob="hacker"
>>>for c in myjob:
>>> print c
>这不就是个遍历么,还说的递归那么夸张。
字符串的定义是有序的字符集合,所以可以通过位置访问他们的内容。其实这一点和c++差不多,c++有人理解为师char的数组,其实一样。
最大的一点不同是python支持负索引,就是负索引是从-1来的。
s=”name”
s[-1]
结果是e
这个解释比较好:负索引其实是默认加了一个长度
S[-2]其实和S[len(s)-2]
就是默认加了一个长度,省略了而已。
关于string的用法蜗牛之前写过文章,就不说了。
注意string是不可变序列,要想改变string就去重新生成一个新的string。
格式化输出:
>>>name="hahah"
>>>"my name is %s" %name
这样那么就嵌入进去了。%s是字符串占位符的意思
格式化输出还有很多用法
>>>"%s--%s--%s" %("haha","hehe","lala")
>>>"%s--%s--%s" %(43,123.54,[1,2,3])
上面这个就有趣多了,暗地里其实做了类型转换。
上面这个43放到%s的位置的时候会转化为string的类型,只是感觉不到罢了,你的感觉是只是把这个东西输出了,没毛病。
string内置提供了一堆函数,比如转化为大写什么的,有空看看。
列表
列表其实就是收集其他对象的地方。也就是一个数组,如果你还是脱不开c++的阴影的话。
注意列表是有顺序的
列表的特点:
-列表是有序的,那就能通过索引去访问了,那就能分片了。
-列表式可变长度,异构,任意嵌套。列表的长度是可变的,增加减元素都可以,而且是异构的,则代表列表中的元素可以使不一样的。
-列表里面的元素也是可变的,也就是说支持索引赋值。
之前这样是不对的,有错:
>>>name="hello"
>>>name[2]="a"
>会有错
>但是这样
>name=["haha","jehe"]
>name[1]="hiehie"
>就是可以的。
之前说过string是一个大类“序列”,其实列表list也是一个序列。
只不过string这种序列是不变的,而list这种序列是可变的
另外注意的一点,如果不是你自己多事儿,一般你用的都是对象的引用。
你把一个对象放到数组中,python存储的都是一个对象的引用。都是解释器屏蔽掉了细节。
列表的常见方法:
- L2.sort()列表排序
- L2.reverse()列表翻转。
- L2[i]=l索引赋值
- L2[i:j]=[4,5,6]分片赋值。注意后边是[],因为你是为数组赋值的啊。
如果把列表看作是一个序列,那列表和string很多同样的属性就看出来了,那其实就很好理解了。
只是这里的粒度应该就是列表里面的元素了。
这里再提醒一次,列表是可变的对象,可以原位修改,但是字符串是不可变对象元组也是。
字典
刚才说列表是python内置的最有弹性的数据类型,这里又说了,字典是出了list之外的最有弹性的数据类型。
如果你把列表认为是有序的集合,那列表就是无序的对象集合。
其实两者本来也不一样,字典是key-value键值对,一对一对的是无序的。存取的时候都是通过key,不是偏移量。
字典可以在原位增长或是缩短,应该也可以原位修改,只是是通过key去找的。
字典是唯一内置的映射类型,将键映射到值。
字典里面的元素是无序的,解释器通过特殊的方法来寻找里面的键,进而找到value,你就知道这很快就行了,怎么找键的真的不用关心,里面的学问老大了。
常见的字典操作:
d1={}空的字典
d2={"span":2,"ahha":2} 对,里面的key值就是要有双引号的。
d3=["spen"]通过键访问
d2.has_key("egg")判断时候有egg这个键值?
d2.keys()返回的是d2中的所有的键值的列表
d2.values()返回的是d2中的所有的值的列表
len(d2)返回d2里面有几个key-value键值对
d2["egg"]="haha"原位修改
del d2[key]删除元素。
不过这里面的key值加不加引号我就得去具体的看看了
我看了,是加的。
d2["egg"]="balalala"
里面的key值也是要加双引号的。
于是就出现了下面这种用法:
d2={"haha":"123",
"hehe":"456"}
language="haha"
print d2[language]
输出的应该是"123"
但是print d2["language"]是错的。
字典是可以改变的,字典可以改变,扩展,缩小而无需生成一个新的字典。
字典为什么不能进行有序的访问什么的?
是因为字典本身就 不是个序列啊!他只是个映射而已。
而且键也不一定非得是字符串,因为数字也可以是键。