https://mp.weixin.qq.com/s/w0NoDiYfvtTy8N3BVoIVpw

为什么选择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-8a = 'abc'b = a.replace('a','A')print bprint 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就叫做闭包。
装饰器就是一个闭包。

如何学习Python的一些总结的更多相关文章

  1. 学习python

    最近感觉Python 很不错的样子,乘着这次寒假,不如就先学一下吧. 翻看了一些教程,发现<python 简明教程>质量上乘. 我目前学习python就是打算做一些上位机之类的,好像有点杀 ...

  2. Python学习--Python基础语法

    第一个Python程序 交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码. linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗 ...

  3. Linux运维人员如何学习python编程

    Linux运维人员如何学习python编程 从不会写代码,到自己独立能写代码解决问题 .这个问题很重要!盲目学习所谓的项目,最后 还是不会自己写代码解决问题.首先解决了独立能写代码解决问题,再通过项目 ...

  4. 新手学习Python时常见的错误

    最近学习Python,现在把一些常见的错误总结如下: 1)忘记在 if , elif , else , for , while , class ,def 声明末尾添加 :(导致 "Synta ...

  5. 学习Python的三种境界

    前言 王国维在<人间词话>中将读书分为了三种境界:"古今之成大事业.大学问者,必经过三种之境界:'昨夜西风凋碧树,独上高楼,望尽天涯路'.此第一境也.'衣带渐宽终不悔,为伊消得人 ...

  6. 1 python学习——python环境配置

    1 python学习--python环境配置 要学习python语言,光看书看教程还是不好,得动手去写.当然,不管学习什么编程语言,最佳的方式还在于实践. 要实践,先得有一个Python解释器来解释执 ...

  7. 如何学习Python

    [整理]如何学习Python + 如何有效利用Python有关的网络资源 + 如何利用Python自带手册(Python Manual) http://www.crifan.com/howto_lea ...

  8. 学习Python的第一课(简单的单元测试)

    由于有C#开发基础,感觉学习Python应该不难,主要是一些语法了,再加上现在互联网这么发达. 感觉还是要有思路,否则学什么也只能是什么. 话不多说,简单发下这几天的学习成果吧: 第一次写博客,大家不 ...

  9. 创业日记-关于学习Python

    2015年7月2日 深圳 阴天 学习Python有一个月了,总整感觉Python是一个比较小而灵活的语言. 为什么要学习Python 今年我已入行有9年了,一直在写C#,关于微软的集成环境也用的比较顺 ...

  10. 学习Python编程的11个资源

    用 Python 写代码并不难,事实上,它一直以来都是被声称为最容易学习的编程语言.如果你正打算学习 web 开发,Python 是一个不错的选择,甚至你想学游戏开发也可 以从 Python 开始,因 ...

随机推荐

  1. npm ci命令比npm installer命令快2至10倍

    npm 5.7.1的发布给我们带了一系列新的功能. 其中我最喜欢的就是npm ci命令了. npm ci命令 1.npm ci命令只根据lock-file去下载node_modules. 如果你的pa ...

  2. 怎样判断一个exe可执行程序(dll文件)是32位的还是64位的

    看到一个比较简单粗暴的方式,做个记录. 直接用记事本或者notepad++(文本编辑软件都可)打开exe文件(dll文件), 会有很多乱码,接下来只需要在第二段中找到PE两个字母,在其后的不远出会出现 ...

  3. NFS客户端挂载目录后无写入权限的解决方案

    转载至:https://blog.csdn.net/younger_china/article/details/52089337 在客户机通过 mount -o rw -t nfs 192.168.1 ...

  4. Python结合OpenCV学习资料

    1.sunny2038的专栏  http://blog.csdn.net/sunny2038 作者建立了一个学习系列.讲得非常具体,有非常多的主要的图像处理实例. 2. https://github. ...

  5. 自定义View系列教程01--常用工具介绍

    站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定 ...

  6. 转载 初探Promise

    初探Promise https://segmentfault.com/a/1190000007032448 javascript es6 promise 33.5k 次阅读  ·  读完需要 65 分 ...

  7. jdbc连接数据库的步骤(转载)

    http://hzy3774.iteye.com/blog/1689525   1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过jav ...

  8. Node.js入门笔记

    第一步自然是安装了.我是用Webstorm这个ide,安装分2步: 1.安装nodejs,下载Windows下的安装版本号.注意是以msi为扩展名的,然后下一步.没啥好说的,下载地址例如以下: 32位 ...

  9. POP介绍与使用实践(快速上手动画)

    http://adad184.com/2015/03/11/intro-to-pop/ 前言 动画在APP开发过程中 大家多多少少都会接触到 而且随着ios7的扁平化风格启用之后 越来越多的APP开始 ...

  10. C++中delete this

    Is it legal (and moral) for a member function to say delete this? As long as you’re careful, it’s ok ...