-
因为曾经学过c语言和java所以学python快一点
-
希望自己以后在学习Python的过程中可以边学习边总结,就自己之前的学习先做以总结,之后将不断总结更新。
-
同学们总问我为啥选修python,以下是我选择它的理由:
-
根据TIOBE最新排名 ,Python已超越C#,与Java,C,C++一起成为全球前4大最流行语言
-
Python被广泛应用于后端开发、游戏开发、网站开发、科学运算、大数据分析、云计算,图形开发等领域
-
Python在软件质量控制、提升开发效率、可移植性、组件集成、丰富库支持等各个方面均处于先进地位
-
python具有 简单、易学、免费、开源、可移植、可扩展、可嵌入、面向对象 等 优点,它的面向对象甚至比java和C#.net更彻底
在 Python 中,由于内存管理是由 Python 解释器负责的,所以开发人员就可以从内存事务中解放出来,全神贯注于最直接的目标,仅仅致力于开发计划中首要的应用程序。这会使错误更少、程序更健壮、开发周期更短。
因为Python等动态语言每一个简单的操作都需要大量的指令才能完成。Python是动态语言,变量只是对象的引用,比如对于一个简单的操作:a+b,在C语言中只需要一个机器指令ADD就好,而对于Python而言,变量a和b本身没有类型,而它们的值有类型,所以在相加之前需要先判断类型,之后,读取数值,相加,生成一个新对象,将运算结果存入,返回对象,当然,可能还会考虑内存溢出等问题。
因为是面对对象所以java里有的类概念python也有
class Student
def __init__(self,name,grade):
self.name, self.grade=name,grade
#内置sort 函数只引用<比较符来判断前后
def __lt__(self,other):
#成绩比other高的,排在他前面
return self,grade>other.grade
#Student的易读字符串表示
def__str__(self):
return :(%s,%d)"%(self.name, self.grade)
子类可以添加中没有的方法和属性,如果子类同名方法覆盖了父类的方法,仍然还可以调用父类的方法
class GasCar(Car):
def__init__(self,name,capacity):名称和排量
super().__ifit__(name)#父类初始化方法,只有名称
self.capacity=capacity#增加了排量属性
数据类型
python中的数据类型可以分为:字符串、布尔类型、整数、浮点数、数字、列表、元组、字典和日期。
字符串
不可变对象,可使用单引号,双引号扩起来表示单行字符串,使用三引号表示多行字符串,在三引号可以自由的使用单引号和双引号。
UTF-8
经常在.py文件的开头写的"#coding:utf-8”是什么意思?我们知道Unicode编码要比ASCII编码多一倍的存储空间,在存储和传输上会十分的不划算,如果写的文本全是英文的话,使用Unicode编码就十分浪费。于是UTF-8编码出现了,UTF-8编码是把一个Unicode字符根据不同的数字大小编码成1-6个字节,并且可以将ASCII码看成是UTF-8的一部分。
编码解码
在Python2.7中,操作系统给它什么编码的字符串,它就接收啥格式的字符串,默认的格式与使用的格式不同,就会出现各种错误。
解决方法:
1.知道系统所使用的编码格式
2.把获取的页面先用系统格式解码,然后在编码为utf8格式
3.你的脚本中统一使用uft8编码
4.处理结束,把你的字符串先utf8解码,然后系统格式编码。
Python中,通常使用decode()和encode()进行解码和编码。
布尔类型
一个布尔值只有True和Flase两种值
整数
包括整数和负整数。
浮点数
就是小数 整数和浮点数在计算机内部的存储是不同的 整数的运算永远是精确的 而浮点运算可能有四舍五入的误差
列表List
list是一个是一个可变的有序表,是Python内置的一种数据类型,可以随时添加、删除、替换其中的元素。
Python中的列表就是一个迭代器,我们知道Python是使用C编写的,那么list的内部实现是怎样的呢?Python中的列表是基于PyListObject实现的,PyListObject是一个变长对象,在内部通过一些方法维护列表的地址,进行内存管理等实现列表的功能。
元组Tuple
除了元组以外的另一种有序表称为元组tuple,但是tuple一旦初始化便不能修改,在定义时,tuple的元素就被确定了。为什么要引入tuple呢?因为tuple不可变,所以代码更为安全,能用tuple代替list的情况就尽量使用tuple。
由于元组是不可变的,因此修改元素操作是非法的,但是可通过对元素进行连接组合,比如:tuple3 = tuple1 + tuple2。
使用del语句可删除整个元组。
字典Dict
Python内置了字典,使用key-value存储,具有极快的查找速度。和list相比,查找速度要高很多。
为什么dict查找速度这么快?因为dict的实现原理和查字典是一样的。假设字典包含了1万个汉字,我们要查某一个字,一个办法是把字典从第一页往后翻,直到找到我们想要的字为止,这种方法就是在list中查找元素的方法,list越大,查找越慢。第二种方法是先在字典的索引表里(比如部首表)查这个字对应的页码,然后直接翻到该页,找到这个字,无论找哪个字,这种查找速度都非常快,不会随着字典大小的增加而变慢。
dict的初始化如下:
a = {}
a['A'] = 1
Dict和List的区别:Dict的查找速度和插入速度都是极快的,不会随着key的增加而增加;但dict要占用大量的内存,内存浪费多。
Dict是不可变对象,因为使用key来计算value的存储位置,为了保证结果的正确性,作为key的对象不能变,可使用字符串、整数等不可变的对象作为dict中的key。
结合Set
set和dict类似,也是一组key的集合,但是不同的是在set中没有重复的key。
可变和不可变
综上所述,Python中的不可变对象有:字符串、整数、元组;可变对象有:列表,集合,字典。
对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,而对于不可变对象,比如str,使用replace()方法,虽然可以更改值,但是变量的值并不会发生改变,为什么呢?
比如:
#coding:utf-8
a = 'abc'
b = a.replace('a','A')
print b
print a
a是变量,而'abc'才是字符串对象,为什么a的值在执行完上述代码之后还是'abc',是因为a本身是一个变量,指向的对象是'abc',调用方法replace是作用在字符串对象'abc'上的,但并没有改变'abc‘的内容,只是新创建了一个对象并赋值给b变量。
对于不可变对象,调用自身的任意方法,并不会改变对象自身的内容,这些方法会创建新的对象并返回,保证了不可变对象本身是永远不可变的。
传值还是传引用
Python在参数传递时遇到的一个有趣的问题是:函数的传参是传值还是传引用?
对于不可变对象作为函数参数,相当于C系语言的值传递;
对于可变对象作为函数参数,相当于C系语言的引用传递。
Python中的对象
对象可以说是Python最核心的一个概念,在Python的世界里,一切都是对象。我们知道Python是由C编写的,C并不是一个面向对象语言,而由C编写的Python确实面向对象的,那么它的对象机制是如何实现的呢?
对于人的思维,对象是可以形象描述的,但是对于计算机而言,对象是一个抽象的概念,计算机所知道的一切都是字节。关于对象,通常的说法是,对象是数据以及基于这些数据的操作的集合,在计算机中,一个对象实际就是把一片被分配的内存空间,且这片内存在更高层次可作为一个整体,这个整体就是一个对象。
在Python中,对象就是C中的结构体在堆上申请的一块内存。
在学习中碰到的重点
可以用来生成列表,字典和集合的语句
[<表达式> for <变量> in <可迭代对象> if <逻辑条件>]
{<键值表达式>:<元素表达式>for <变量> in <可迭代对象> if <逻辑条件>]}
{<元素表达式>for <变量> in <可迭代对象> if <逻辑条件>]}
>>>[x*x for x in range(10)]
[0,1,4,9,16,25,36,49,64,81]
>>>
>>>{'k%d'%(x,):x**3 for x in range(10)}
{'k2':8,'k8':512,'k5':125,'k6':216,'k3':27,'k9':729,'k0':0,'k7':343,'k1':1,'k4':64}
>>>
>>>{x*x for x in range(10)}
{0,1,64,4,36,9,16,49,81,25}
>>>
>>>{x+y for x in range(10) for y in range(x)}
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}
列表操作:
1、list 函数可以把所有序列转换成 list。可以通过 "".join(somelist) 来把字符组成的列表转换为字符串。
2、删除元素: del lt[0] ,del 还可以删除某个变量。
3、分片赋值,这个比较强大,可以使用与原序列不等长的序列将分片替换,也可以实现在任意一个位置直接插入一段新序列,同样的可以实现删除元素(分片替换为空序列,效果等同于 del lt[1:4]),更复杂的是加上步长,甚至是负数步长的分片赋值操作。
4、append alist.append(item) 列表末尾添加元素
insert alist.insert(i,item) 列表中i位置插入元素
pop alist.pop() 删除最后一个元素,并返回其值
pop alist.pop(i) 删除第i个元素,并返回其值
sort alist.sort() 将表中元素排序
reverse alist.reverse() 将表中元素反向排列
del del alist[i] 删除第i个元素
index alist.index(item) 找到item的首次出现位置 count alist.count(item) 返回item在列表中出现的次数 remove alist.remove(item) 将item的首次出现删除
字符串操作:
1、字符串是不可变的,所以类似于分片赋值是不可行的。
2、字符串格式化:
#格式化操作符右操作数可以是任何东西,如字符串变量,元组或字典等 print "user'name is %s" %"tianya" print "username:%s password:%s" %("tianya","123456") mydict = {"username":"tianya","password":"123456"} print "username:%(username)s password:%(password)s" %mydict
如果格式化字符串里包括百分号,则必须使用 %% ,否则会被认为是转换说明符。
建立大型数据结构
〉 嵌套列表 列表的元素是一些列表 alist[i][j] 〉 字典的元素可以是任意类型,甚至 也可以是字典 bands={'Marxes':['Moe','Curly']}〉 字典的键值可以是任意不可变类型, 例如用元组来作为坐标,索引元素 poi={(100,100):'bus stop'}