python学习总结

来源:互联网 发布:php shell exec 输出 编辑:程序博客网 时间:2024/06/05 09:36
  • 因为曾经学过c语言和java所以学python快一点
  • 希望自己以后在学习Python的过程中可以边学习边总结,就自己之前的学习先做以总结,之后将不断总结更新。
  • 同学们总问我为啥选修python,以下是我选择它的理由:
  • 根据TIOBE最新排名 ,Python已超越C#,与Java,C,C++一起成为全球前4大最流行语言
  • Python被广泛应用于后端开发、游戏开发、网站开发、科学运算、大数据分析、云计算,图形开发等领域
  • Python在软件质量控制、提升开发效率、可移植性、组件集成、丰富库支持等各个方面均处于先进地位
  • python具有 简单、易学、免费、开源、可移植、可扩展、可嵌入、面向对象 等 优点,它的面向对象甚至比java和C#.net更彻底

首先Python是面向对象编程,python比其他语言优势在于
C 或者 C++最大的弊病在于内存管理是由开发者负责的。所以哪怕是对于一个很少访问、修改和管理内存的应用程序,程序员也必须在执行了基本任务之外履行这些职责。这些加诸在开发者身上的没有必要的负担和责任常常会分散精力。
在 Python 中,由于内存管理是由 Python 解释器负责的,所以开发人员就可以从内存事务中解放出来,全神贯注于最直接的目标,仅仅致力于开发计划中首要的应用程序。这会使错误更少、程序更健壮、开发周期更短。

当然python也有缺点:运行速度相较于C语言慢

因为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-8a = 'abc'b = a.replace('a','A')print bprint 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'}