zoukankan      html  css  js  c++  java
  • python学习总结

    关于Python的一些总结

    希望自己以后在学习Python的过程中可以边学习边总结,就自己之前的学习先做以总结,之后将不断总结更新。

    为什么选择Python

    经常会有同学问我为什么选择Python。我很喜欢这门语言,因为它的简洁灵活,易学,易读,可移植并且功能强大。

    高级

    可以说,每一代编程语言的产生,我们都会达到一个新的高度。从汇编语言,到C Pascal等,伴随着C语言的诞生,产生了C++、Java这样的现代编译语言,之后有了强大的可以进行系统调用的解释性脚本语言Python、 Perl...
    比如Python中就有一些高级的数据结构,列表和字典就是内建于语言本身可以直接使用的,在核心语言中提供这些重要的构建单元,可以缩短开发时间和代码量,产生可读性更好的代码。

    面向对象

    Python是面向对象编程

    内存管理器

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

    解释性和编译性

    Python 是一种解释型语言,这意味着开发过程中没有了编译这个环节。一般来说,由于不是以本地机器码运行,纯粹的解释型语言通常比编译型语言运行的慢。然而,类似于 Java,Python实际上是字节编译的,其结果就是可以生成一种近似机器语言的中间形式。这不仅改善了 Python的性能,还同时使它保持了解释型语言的优点。

    Python为什么运行速度相较于C语言慢

    因为Python等动态语言每一个简单的操作都需要大量的指令才能完成。Python是动态语言,变量只是对象的引用,比如对于一个简单的操作:a+b,在C语言中只需要一个机器指令ADD就好,而对于Python而言,变量a和b本身没有类型,而它们的值有类型,所以在相加之前需要先判断类型,之后,读取数值,相加,生成一个新对象,将运算结果存入,返回对象,当然,可能还会考虑内存溢出等问题。

    Python基础

    数据类型

    python中的数据类型可以分为:字符串、布尔类型、整数、浮点数、数字、列表、元组、字典和日期。

    字符串

    不可变对象,可使用单引号,双引号扩起来表示单行字符串,使用三引号表示多行字符串,在三引号可以自由的使用单引号和双引号。

    ASCII码

    字符串比较特殊的是编码问题 我们知道,计算机是美国人发明的,最初只有127个字母被编码到计算机中,包括大小写字母、数字和一些符号,这个编码表被称为ASCII码表。

    Unicode

    要处理一个中文显然一个字节是不够用的,又不能和ASCII码冲突,因此中国制定了GB2312编码。而全世界有很多的语言,在多语言混合的文本中,显示出来的话一定会有乱码,因此,Unicode应运而生,它将所有语言统一到一套编码中,就不会有乱码问题了。ASCII码用一个字节表示了一个字符,而Unicode用两个字节表示一个字符。以Unicode表示的字符串用u'...'表示。

    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中的迭代器是什么呢?
    迭代器是访问集合元素的一种方式,迭代器的对象是从集合的第一个元素开始访问,直到所有的元素访问完结束,迭代器只能前进而不能后退。
    对于遍历支持随机访问的数据结构(tuple,list),迭代器相比于for循环并无优势,因为迭代器丢失了索引值。但对于无法随机访问的数据结构,迭代器是唯一的访问元素的方式。
    迭代器不要求事先准备好整个迭代过程中的所有元素,迭代器仅在迭代到某个元素时才计算该元素,迭代器仅仅在迭代到某个元素时才计算该元素,在这之前或之后,元素可以不存在或者被销毁,这个特点使得迭代器特别适合用于遍历一些巨大的或是无限的集合。
    迭代器中有两个基本的方法:
    next方法:返回迭代器的下一个元素
    __iter__方法:返回迭代器对象本身。

    生成器

    带有yield的函数在Python中被称为生成器。yield就是将函数变成了一个生成器,函数执行过程中使用yield就好像是用yield将执行中断多次,每次中断都会通过yield返回当前的迭代值。
    当数据量较大时,使用生成器的效率更高。

    装饰器

    函数是一个对象,函数对象也可以被赋值给变量,所以,通过变量也能调用该函数。在代码运行期间动态增加功能的方式,称为装饰器。使用Python的@语法,把装饰器置于函数的定义处。

    元类

    类是用来描述如何生成一个对象的代码段,在Python中,类同样是一个对象,只要使用class关键字,Python解释器在执行的时候就会创建一个对象。这个对象自身拥有创建对象的能力,所以它是一个类,但它本身还是一个对象,因此,可以实现以下操作:可以将它赋值给一个变量、可以拷贝它、可以为它增加属性、可以将它作为函数参数进行传递。
    这也是动态语言和静态语言最大的不同,函数和类的定义,不是编译时定义的,而是运行时动态创建的。也就是在Python中,可以动态的创建类,类也是对象,这就是使用关键字class时Python在幕后做的事情,这些都是通过元类实现的。
    那么到底什么是元类呢?
    元类就是用来创建类的东西,创建类就是为了创建类的实例对象,但是我们知道类就是对象,元类就是用来创建这些类(对象)的,所以元类就是类的类。
    元类是创建类这种对象的东西,可以将元类称为类工厂。
    元类的主要用途是创建API。

    闭包

    Python中的闭包是什么?
    如果在一个内部函数里,对在外部作用域的变量进行引用,那么内部函数就被认为是闭包。用Python的语言介绍就是,调用一个函数A,这个函数A返回了一个函数B给你,这个返回的函数B就叫做闭包。
    装饰器就是一个闭包。

  • 相关阅读:
    学习NAnt Build .CS+Solution+MSBuild+SVN+NUnit+NUnitReport
    每日集成CruiseControl.NET + SVN + Msbuild + NAnt
    通过spring.net中的spring.caching CacheResult实现memcached缓存
    c# 简单文件流读写CSV文件
    ajax系列之用jQuery的ajax方法向服务器发出get和post请求
    我的2016书单以及为2017年准备的书单
    微信网页开发之获取用户unionID的两种方法--基于微信的多点登录用户识别
    微信开发之分清公众平台和开放平台、公众号全局凭证和网页授权凭证
    网站实现微信登录之回调函数中登录逻辑的处理--基于yii2开发的描述
    网站实现微信登录之嵌入二维码——基于yii2开发的描述
  • 原文地址:https://www.cnblogs.com/ybjourney/p/5994588.html
Copyright © 2011-2022 走看看