python2.7学习记录
一.两个学习网址(2.7已经过时,建议直接学习3)
http://blog.csdn.net/longxibendi/article/details/41949215
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000
二.开发工具:pycharm
破解参考http://www.cnblogs.com/evlon/p/4934705.html
快捷键http://www.cnblogs.com/zhangpengshou/p/3555767.html
三.python切换到指定目录:使用os包的chdir函数能够改变当前工作路径,linux和windows操作系统中并没有区别。
#获取当前工作目录
>>>os.getcwd()
#更改当前工作目录
>>>os.chdir('d:\')
>>>os.getcwd()
四.打印中文:开头加上#coding=utf-8 就ok了
五.语法
1.>>>python hello.py
File "<stdin>", line 1 python hello.py
SyntaxError:invalid syntax
出错是因为你已经进入python解释器,而不是 在cmd环境里
如果要运行helloworld.py这个文件,你需要在cmd里直接运行。
显示是这样的C:\Users\Administrator\Desktop>python hello.py
2.raw_input,可以让用户输入字符串,并存放到一个变量里。比如输入用户的名字:>>> name = raw_input(),3+的版本用input()
代替了raw_input()
name = raw_input('please enter your name: ')
print 'hello,', name
3.用r''表示''内部的字符串默认不转义
用'''...'''的格式表示多行内容
空值是Python里一个特殊的值,用None表示
在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量。这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。
理解变量在计算机内存中的表示也非常重要。当我们写:a = 'ABC'时,Python解释器干了两件事情:
在内存中创建了一个'ABC'的字符串;
在内存中创建了一个名为a的变量,并把它指向'ABC'。
也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据。
Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来。
在Python中,通常用全部大写的变量名表示常量
整数除法永远是整数,即使除不尽。要做精确的除法,只需把其中一个整数换成浮点数做除法就可以。。3+的整型除法返回浮点数,要得到整型结果用//
六、编码
由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII
编码。
全世界有上百种语言,日本把日文编到Shift_JIS
里,韩国把韩文编到Euc-kr
里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
现在,捋一捋ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节。
如果把ASCII编码的A
用Unicode编码,只需要在前面补0就可以,因此,A
的Unicode编码是00000000 01000001
。新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。
所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8
编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。
现在计算机系统通用的字符编码工作方式:在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件;浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器。
七、一些存储结构
1.Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。用len()函数可以获得list元素的个数。用-1做索引,直接获取最后一个元素。
list里面的元素的数据类型可以不同,list元素也可以是另一个list,空list如 L = []长度为0
追加 classmates.append('Adam')
插入 classmates.insert(1, 'Jack')
删除list末尾的元素,用pop()方法 classmates.pop()
删除指定位置i的元素,用pop(i)方法 classmates.pop(1)
某个元素替换成别的元素,可以直接赋值给对应的索引位置 classmates[1] = 'Sarah'
2.另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。tuple的每个元素的指向永远不变。
3.dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字,无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。dict就是第二种实现方式,给定一个名字,比如'Michael',dict在内部就可以直接计算出Michael对应的存放成绩的“页码”,也就是95这个数字存放的内存地址,直接取出来,所以速度非常快。你可以猜到,这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。
和list比较,dict有以下几个特点:查找和插入的速度极快,不会随着key的增加而增加;需要占用大量的内存,内存浪费多。
而list相反:查找和插入的时间随着元素的增加而增加;占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。这个通过key计算位置的算法称为哈希算法(Hash)。要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key。最常用的key是字符串。
为什么dict需要的内存要比list的多 内存中是怎么保存key与value的:列表应该可以数组,可以链表,因为它可以存取,也可以添加删改。 字典的话,应该是链表的数组吧。key值应该是哈希表,value存放应该没有关系,根据key值可以计算出value 存放的地址,那么必然在key值里还存放着另外的内容,即特别的内容来计算对应value的内存地址,所以需要的空间就多-静水汤汤
4.set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key,重复元素在set中自动被过滤。通过add(key)
方法添加元素到set中,通过remove(key)
方法删除元素。set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作。
八、函数
1.抽象是数学中非常常见的概念,举个例子: 计算数列的和,比如:1 + 2 + 3 + ... + 100,写起来十分不方便,于是数学家发明了求和符号∑
借助抽象,我们才能不关心底层的具体计算过程,而直接在更高的层次上思考问题。写计算机程序也是一样,函数就是最基本的一种代码抽象的方式。函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”。
2.在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
我们以自定义一个求绝对值的my_abs函数为例:
def my_abs(x):
if x >= 0:
return x
else:
return -x
3.如果想定义一个什么事也不做的空函数,可以用pass语句:
def nop():
pass
pass语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。
pass还可以用在其他语句里,比如:
if age >= 18:
pass
缺少了pass,代码运行就会有语法错误。
4.对参数类型做检查,只允许整数和浮点数类型的参数。数据类型检查可以用内置函数isinstance实现
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
5.在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。
6.使用默认参数有什么好处?最大的好处是能降低调用函数的难度。如学生注册时不需要提供年龄和城市,只提供必须的两个姓名和密码,只有与默认参数不符的学生才需要提供额外的信息。默认参数必须指向不变对象!原因:Python函数在定义的时候,默认参数L
的值就被计算出来了,即[]
,因为默认参数L
也是一个变量,它指向对象[]
,每次调用该函数,如果改变了L
的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]
了。如默认参数是[]
,但是函数似乎每次都“记住了”上次添加了'END'
后的list。
def add_end(L=[]):
L.append('END')
return L
7.可变参数:Python允许你在list或tuple前面加一个*
号,把list或tuple的元素变成可变参数传进去。
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
8.可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。示例 def person(name, age, **kw
)
关键字参数有什么用?它可以扩展函数的功能。比如,在person函数里,我们保证能接收到name和age这两个参数,但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。
def func(a, b, c=0, *args, **kw)在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。对于任意函数,都可以通过类似func(*args, **kw)
的形式调用它,无论它的参数是如何定义的。
>>>
func(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}