1. Python介绍
  2. Python 2 or 3?
  3. Hello World程序
  4. 变量、字符编码
  5. .pyc是个什么鬼?
  6. 数据类型初识
  7. 数据运算
  8. 表达式if … else
  9. 表达式for loop
  10. while loop

一、Python介绍

python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。

Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、腾讯、汽车之家、美团等。

目前Python主要应用领域:

  • 云计算: 云计算最火的语言, 典型应用OpenStack
  • WEB开发: 众多优秀的WEB框架,众多大型网站均为Python开发,Youtube, Dropbox, 豆瓣。。。, 典型WEB框架有Django
  • 科学运算、人工智能: 典型库NumPy, SciPy, Matplotlib, Enthought librarys,pandas
  • 系统运维: 运维人员必备语言
  • 金融: 量化交易,金融分析,在金融工程领域,Python不但在用,且用的最多,而且重要性逐年提高。原因:作为动态语言的Python,语言结构清晰简单,库丰富,成熟稳定,科学计算和统计分析都很牛逼,生产效率远远高于c,c++,java,尤其擅长策略回测
  • 图形GUI: PyQT, WxPython,TkInter

云计算: 云计算最火的语言, 典型应用OpenStack
WEB开发: 众多优秀的WEB框架,众多大型网站均为Python开发,Youtube, Dropbox, 豆瓣。。。, 典型WEB框架有Django
科学运算、人工智能: 典型库NumPy, SciPy, Matplotlib, Enthought librarys,pandas
系统运维: 运维人员必备语言
金融:量化交易,金融分析,在金融工程领域,Python不但在用,且用的最多,而且重要性逐年提高。原因:作为动态语言的Python,语言结构清晰简单,库丰富,成熟稳定,科学计算和统计分析都很牛逼,生产效率远远高于c,c++,java,尤其擅长策略回测
图形GUI: PyQT, WxPython,TkInter
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

Python 是一门什么样的语言?

编程语言主要从以下几个角度为进行分类,编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语言,每个分类代表什么意思呢,我们一起来看一下。

编译型和解释型
我们先看看编译型,其实它和汇编语言是一样的:也是有一个负责翻译的程序来对我们的源代码进行转换,生成相对应的可执行代码。这个过程说得专业一点,就称为编译(Compile),而负责编译的程序自然就称为编译器(Compiler)。如果我们写的程序代码都包含在一个源文件中,那么通常编译之后就会直接生成一个可执行文件,我们就可以直接运行了。但对于一个比较复杂的项目,为了方便管理,我们通常把代码分散在各个源文件中,作为不同的模块来组织。这时编译各个文件时就会生成目标文件(Object file)而不是前面说的可执行文件。一般一个源文件的编译都会对应一个目标文件。这些目标文件里的内容基本上已经是可执行代码了,但由于只是整个项目的一部分,所以我们还不能直接运行。待所有的源文件的编译都大功告成,我们就可以最后把这些半成品的目标文件“打包”成一个可执行文件了,这个工作由另一个程序负责完成,由于此过程好像是把包含可执行代码的目标文件连接装配起来,所以又称为链接(Link),而负责链接的程序就叫……就叫链接程序(Linker)。链接程序除了链接目标文件外,可能还有各种资源,像图标文件啊、声音文件啊什么的,还要负责去除目标文件之间的冗余重复代码,等等,所以……也是挺累的。链接完成之后,一般就可以得到我们想要的可执行文件了。

上面我们大概地介绍了编译型语言的特点,现在再看看解释型。噢,从字面上看,“编译”和“解释”的确都有“翻译”的意思,它们的区别则在于翻译的时机安排不大一样。打个比方:假如你打算阅读一本外文书,而你不知道这门外语,那么你可以找一名翻译,给他足够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读;或者,你也立刻让这名翻译辅助你阅读,让他一句一句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。

两种方式,前者就相当于我们刚才所说的编译型:一次把所有的代码转换成机器语言,然后写成可执行文件;而后者就相当于我们要说的解释型:在程序运行的前一刻,还只有源程序而没有可执行程序;而程序每执行到源程序的某一条指令,则会有一个称之为解释程序的外壳程序将源代码转换成二进制代码以供执行,总言之,就是不断地解释、执行、解释、执行……所以,解释型程序是离不开解释程序的。像早期的BASIC就是一门经典的解释型语言,要执行BASIC程序,就得进入BASIC环境,然后才能加载程序源文件、运行。解释型程序中,由于程序总是以源代码的形式出现,因此只要有相应的解释器,移植几乎不成问题。编译型程序虽然源代码也可以移植,但前提是必须针对不同的系统分别进行编译,对于复杂的工程来说,的确是一件不小的时间消耗,况且很可能一些细节的地方还是要修改源代码。而且,解释型程序省却了编译的步骤,修改调试也非常方便,编辑完毕之后即可立即运行,不必像编译型程序一样每次进行小小改动都要耐心等待漫长的Compiling…Linking…这样的编译链接过程。不过凡事有利有弊,由于解释型程序是将编译的过程放到执行过程中,这就决定了解释型程序注定要比编译型慢上一大截,像几百倍的速度差距也是不足为奇的。

编译型与解释型,两者各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)、VB等基本都可视为编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python等等。

但既然编译型与解释型各有优缺点又相互对立,所以一批新兴的语言都有把两者折衷起来的趋势,例如Java语言虽然比较接近解释型语言的特征,但在执行之前已经预先进行一次预编译,生成的代码是介于机器码和Java源代码之间的中介代码,运行的时候则由JVM(Java的虚拟机平台,可视为解释器)解释执行。它既保留了源代码的高抽象、可移植的特点,又已经完成了对源代码的大部分预编译工作,所以执行起来比“纯解释型”程序要快许多。而像VB6(或者以前版本)、C#这样的语言,虽然表面上看生成的是.exe可执行程序文件,但VB6编译之后实际生成的也是一种中介码,只不过编译器在前面安插了一段自动调用某个外部解释器的代码(该解释程序独立于用户编写的程序,存放于系统的某个DLL文件中,所有以VB6编译生成的可执行程序都要用到它),以解释执行实际的程序体。C#(以及其它.net的语言编译器)则是生成.net目标代码,实际执行时则由.net解释系统(就像JVM一样,也是一个虚拟机平台)进行执行。当然.net目标代码已经相当“低级”,比较接近机器语言了,所以仍将其视为编译语言,而且其可移植程度也没有Java号称的这么强大,Java号称是“一次编译,到处执行”,而.net则是“一次编码,到处编译”。呵呵,当然这些都是题外话了。总之,随着设计技术与硬件的不断发展,编译型与解释型两种方式的界限正在不断变得模糊。

动态语言和静态语言
通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。

(1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。

(2)静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

强类型定义语言和弱类型定义语言

(1)强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。

(2)弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。

强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的!
例如:Python是动态语言,是强类型定义语言(类型安全的语言); VBScript是动态语言,是弱类型定义语言(类型不安全的语言); JAVA是静态语言,是强类型定义语言(类型安全的语言)。

通过上面这些介绍,我们可以得出,python是一门动态解释性的强类型定义语言。 那这些基因使成就了Python的哪些优缺点呢?我们继续往下看。

Python的优缺点

先看优点

  1. Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。
  2. 开发效率非常高,Python有非常强大的第三方库,基本上你想通过计算机实现任何功能,Python官方库里都有相应的模块进行支持,直接下载调用后,在基础库的基础上再进行开发,大大降低开发周期,避免重复造轮子。
  3. 高级语言————当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节
  4. 可移植性————由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就几乎可以在市场上所有的系统平台上运行
  5. 可扩展性————如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。
  6. 可嵌入性————你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。

再看缺点:

  1. 速度慢,Python 的运行速度相比C语言确实慢很多,跟JAVA相比也要慢一些,因此这也是很多所谓的大牛不屑于使用Python的主要原因,但其实这里所指的运行速度慢在大多数情况下用户是无法直接感知到的,必须借助测试工具才能体现出来,比如你用C运一个程序花了0.1s,用Python是0.01s,这样C语言直接比Python快了10s,算是非常夸张了,但是你是无法直接通过肉眼感知的,因为一个正常人所能感知的时间最小单位是0.15-0.4s左右,哈哈。其实在大多数情况下Python已经完全可以满足你对程序速度的要求,除非你要写对速度要求极高的搜索引擎等,这种情况下,当然还是建议你用C去实现的。
  2. 代码不能加密,因为PYTHON是解释性语言,它的源码都是以名文形式存放的,不过我不认为这算是一个缺点,如果你的项目要求源代码必须是加密的,那你一开始就不应该用Python来去实现。
  3. 线程不能利用多CPU问题,这是Python被人诟病最多的一个缺点,GIL即全局解释器锁(Global Interpreter Lock),是计算机程序设计语言解释器用于同步线程的工具,使得任何时刻仅有一个线程在执行,Python的线程是操作系统的原生线程。在Linux上为pthread,在Windows上为Win thread,完全由操作系统调度线程的执行。一个python解释器进程内有一条主线程,以及多条用户程序的执行线程。即使在多核CPU平台上,由于GIL的存在,所以禁止多线程的并行执行。关于这个问题的折衷解决方法,我们在以后线程和进程章节里再进行详细探讨。

当然,Python还有一些其它的小缺点,在这就不一一列举了,我想说的是,任何一门语言都不是完美的,都有擅长和不擅长做的事情,建议各位不要拿一个语言的劣势去跟另一个语言的优势来去比较,语言只是一个工具,是实现程序设计师思想的工具,就像我们之前中学学几何时,有的时候需要要圆规,有的时候需要用三角尺一样,拿相应的工具去做它最擅长的事才是正确的选择。之前很多人问我Shell和Python到底哪个好?我回答说Shell是个脚本语言,但Python不只是个脚本语言,能做的事情更多,然后又有钻牛角尖的人说完全没必要学Python, Python能做的事情Shell都可以做,只要你足够牛B,然后又举了用Shell可以写俄罗斯方块这样的游戏,对此我能说表达只能是,不要跟SB理论,SB会把你拉到跟他一样的高度,然后用充分的经验把你打倒

Python解释器

当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码,就需要Python解释器去执行.py文件。

由于整个Python语言从规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写Python解释器来执行Python代码(当然难度很大)。事实上,确实存在多种Python解释器。

CPython
当我们从Python官方网站下载并安装好Python 2.7后,我们就直接获得了一个官方版本的解释器:CPython。这个解释器是用C语言开发的,所以叫CPython。在命令行下运行python就是启动CPython解释器。

CPython是使用最广的Python解释器。教程的所有代码也都在CPython下执行。

IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的。好比很多国产浏览器虽然外观不同,但内核其实都是调用了IE。

CPython用>>>作为提示符,而IPython用In [序号]:作为提示符。

PyPy
PyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。

绝大部分Python代码都可以在PyPy下运行,但是PyPy和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解PyPy和CPython的不同点。

Jython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。

IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。

小结
Python的解释器很多,但使用最广泛的还是CPython。如果要和Java或.Net平台交互,最好的办法不是用Jython或IronPython,而是通过网络调用来交互,确保各程序之间的独立性。

二、Python 2 or 3?

py2与3的详细区别
PRINT IS A FUNCTION

The statement has been replaced with a print() function, with keyword arguments to replace most of the special syntax of the old statement (PEP 3105)
You can also customize the separator between items, e.g.:

print("There are <", 2**32, "> possibilities!", sep="")

ALL IS UNICODE NOW

从此不再为讨厌的字符编码而烦恼

某些库改名了

_winreg winreg
ConfigParser configparser
copy_reg copyreg
Queue queue
SocketServer socketserver
markupbase _markupbase
repr reprlib
rtest.test_support test.support

三、Hello World程序

在linux 下创建一个文件叫hello.py,并输入

print("Hello World!")

然后执行命令:python hello.py ,输出

[root@gpf]# vim hello.py
[root@gpf]# python hello.py
Hello World!

指定解释器

上一步中执行 python hello.py 时,明确的指出 hello.py 脚本由 python 解释器来执行。

如果想要类似于执行shell脚本一样执行python脚本,例: ./hello.py ,那么就需要在 hello.py 文件的头部指定解释器,如下:

#!/usr/bin/env pythonprint('Hello World!')

如此一来,执行: ./hello.py 即可。
ps:执行前需给予 hello.py 执行权限,chmod 755 hello.py
在交互器中执行

除了把程序写在文件里,还可以直接调用python自带的交互器运行代码,

[root@gpf]# python
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello World!")
Hello World!

四、变量、字符编码

声明变量

 # -*-coding:utf-8-*-name = "GPF"

上述代码声明了一个变量,变量名为: name,变量name的值为:“GPF” 
变量定义的规则:

  1. 变量名只能是 字母、数字或下划线的任意组合
  2. 变量名的第一个字符不能是数字
  3. 以下关键字不能声明为变量名
    [‘and’, ‘as’, ‘assert’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘exec’, ‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘not’, ‘or’, ‘pass’, ‘print’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’]

字符编码
python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill)

ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256-1,所以,ASCII码最多只能表示 255 个符号。

关于中文

为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。

GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。

GB2312 支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的 GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。

从ASCII、GB2312、GBK 到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。

有的中文Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符,普通人是很难用到的,通常我们还是用GBK指代中文Windows内码。

显然ASCII码无法将世界上的各种文字和符号全部表示,所以,就需要新出一种可以代表所有字符和符号的编码,即:Unicode

Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,
注:此处说的的是最少2个字节,可能更多

UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存…

所以,python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill),如果是如下代码的话:

报错:ascii码无法表示中文

#!/usr/bin/env pythonprint "你好,世界"

改正:应该显示的告诉python解释器,用什么编码来执行源代码,即:

#!/usr/bin/env python
# -*- coding: utf-8 -*- print "你好,世界"

注释
  当行注视:# 被注释内容

多行注释:""" 被注释内容 “”"

五、.pyc是个什么鬼?

1. Python是一门解释型语言?

我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在。如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled的缩写才对啊!

为了防止其他学习Python的人也被这句话误解,那么我们就在文中来澄清下这个问题,并且把一些基础概念给理清。

2. 解释型语言和编译型语言

计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。这个过程分成两类,第一种是编译,第二种是解释。

编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。

解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。

通过以上的例子,我们可以来总结一下解释型语言和编译型语言的优缺点,因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高。但是我们也不能一概而论,一些解释型语言也可以通过解释器的优化来在对程序做出翻译时对整个程序做出优化,从而在效率上超过编译型语言。

此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。

用Java来举例,Java首先是通过编译器编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。

3. Python到底是什么

其实Python和Java/C#一样,也是一门基于虚拟机的语言,我们先来从表面上简单地了解一下Python程序的运行过程吧。

当我们在命令行中输入python hello.py时,其实是激活了Python的“解释器”,告诉“解释器”:你要开始工作了。可是在“解释”之前,其实执行的第一项工作和Java一样,是编译。

熟悉Java的同学可以想一下我们在命令行中如何执行一个Java的程序:

javac hello.java

java hello

只是我们在用Eclipse之类的IDE时,将这两部给融合成了一部而已。其实Python也一样,当我们执行python hello.py时,他也一样执行了这么一个过程,所以我们应该这样来描述Python,Python是一门先编译后解释的语言。

  1. 简述Python的运行过程

在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件。

我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。

当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。

当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。

所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。

六、数据类型初识

1. 数字

    2 是一个整数的例子。长整数 不过是大一些的整数。3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4。(-5+4j)和(2.3-4.6j)是复数的例子,其中-5,4为实数,j为虚数,数学中表示复数是什么?。

int(整型)

在32位机器上,整数的位数为32位,取值范围为-231~231-1,即-2147483648~2147483647
  在64位系统上,整数的位数为64位,取值范围为-263~263-1,即-9223372036854775808~9223372036854775807
long(长整型)
  跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
  注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。
float(浮点型)
  浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型,占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。
complex(复数)
  复数由实数部分和虚数部分组成,一般形式为x+yj,其中的x是复数的实数部分,y是复数的虚数部分,这里的x和y都是实数。
注:Python中存在小数字池:-5 ~ 257

2、布尔值
  真或假
  1 或 0
3、字符串

"hello world"

字符串对应的常用方法:

print('一句话的首字符大写', 'i am gpf'.capitalize())  # 结果:一句话的首字符大写 I am gpf
print('一个字符串不足20,用#在字符串两边代替', 'I am gpf'.center(20, "#"))  # 结果:一个字符串不足20,用#在字符串两边代替 ######I am gpf######
print('一个字符串中含a的字符有几个', 'I am gpf'.count('a'))  # 结果:一个字符串中含a的字符有几个 1print('将字符串转为16进制', 'I am gpf'.encode())  # 结果:将字符串转为16进制 b'I am gpf'
print('一个字符串是否以g结尾', 'I am gpf'.endswith('g'))  # 结果:将字符串转为16进制 False'
print('一个字符串中的tab扩展为8位', 'I \t am gpf'.expandtabs(8))  # 结果:一个字符串中的tab扩展为8位 I        am gpfprint('格式化字符串', 'I am gpf{ss}'.format(ss=' ,yes im gpf'))  # 结果:格式化字符串 I am gpf ,yes im gpf
print('一个字符串中查找am的位置', 'I am gpf'.find('am'))  # 结果:一个字符串中查找am的位置 2# 字符串的切片
strs = 'I am gpf'
print('切片查找:', strs[strs.find('am'):3])  # 结果: 切片查找: aprint('格式化字符串', 'I am gpf{ss}{dd}'.format_map({'ss': ' aaa', 'dd': ' vvvv'}))  # 结果:格式化字符串 I am gpf aaa vvvvprint('是否包含阿拉伯字母或者阿拉伯数字(整数)', 'gpf666'.isalnum())  # 结果:是否包含阿拉伯字母或者阿拉伯数字(整数) True
print('是否纯英文字符', 'gpfF'.isalpha())  # 结果:是否纯英文字符 True
print('是否为十进制数字', '100'.isdecimal())  # 结果:是否为十进制数字 True
print('是否为整数', '100'.isdigit())  # 结果:是否为整数 True
print('是否是一个合法的变量名', 'name'.isidentifier())  # 结果:是否是一个合法的变量名 True
print('是否为小写', 'name'.islower())  # 结果:是否为小写 True
print('是否为空格', ' '.isspace())  # 结果:是否为空格 True
print('是否每个单词的首字母大写', 'My Name Is Gpf'.istitle())  # 结果:是否每个单词的首字母大写 True
print('是否可以打印(字符串都可以打印)', 'My Name Is Gpf'.isprintable())  # 结果:是否可以打印(字符串都可以打印) True
print('是否全是大是写', 'MY NAME IS'.isupper())  # 结果:是否全是大是写 True
print('这个自己理解吧', '+'.join(['1', '2', '3']))  # 结果:这个自己理解吧 1+2+3
print('字符串长度为20,不足的用$填充', 'MY NAME IS'.ljust(20, "$"))  # 结果:字符串长度为20,不足的用$填充 MY NAME IS$$$$$$$$$$
print('字符串长度为20,不足的用$填充', 'MY NAME IS'.rjust(20, "$"))  # 结果:字符串长度为20,不足的用$填充 $$$$$$$$$$MY NAME IS
print('将大写转为小写', 'MY NAME IS'.lower())  # 结果:将大写转为小写 my name is
print('将小写转为大写', 'MY name IS'.upper())  # 结果:将小写转为大写 MY NAME IS
print('左边去除空格回车', '\nMY name IS'.lstrip())  # 结果:左边去除空格回车 MY name IS
print('去除两边的空格和回车', '\nMY name IS   '.strip())  # 结果:去除两边的空格和回车 MY name ISmodle = str.maketrans("abcde", "12345")
print("edcba".translate(modle))  # 结果:54321print('字符串的替换', 'My name is'.replace("m", "a"))  # 结果:字符串的替换 My naae is
print('找到最右边值得下标', 'My name is'.rfind("m"))  # 结果:找到最右边值得下标 5
print('字符串按照空格切分成一个列表', 'My name is'.split(" "))  # 结果:字符串按照空格切分 ['My', 'name', 'is']
print('字符串按照换行符切分', 'My name is'.splitlines())  # 结果:字符串按照换行符切分 ['My name is']
print('将字符串大写变小写,小写变大写', 'My name is'.swapcase())  # 结果:将字符串大写变小写,小写变大写 mY NAME IS
print('20为的字符,不足补全', 'My name is'.zfill(20))  # 结果:20为的字符,不足补全 0000000000My name is

万恶的字符串拼接:
  python中的字符串在C语言中体现为是一个字符数组,每次创建字符串时候需要在内存中开辟一块连续的空,并且一旦需要修改字符串的话,就需要再次开辟空间,万恶的+号每出现一次就会在内从中重新开辟一块空间。
字符串格式化输出

name = "GPF"
print "i am %s " % name#输出: i am GPF

PS: 字符串是 %s;整数 %d;浮点数%f
字符串常用功能:

  • 移除空白
  • 分割
  • 长度
  • 索引
  • 切片

4、列表
创建列表:

name_list = ['gpf', 'lzb', 'nb']
或
name_list = list(['gpf', 'lzb', 'nb'])

基本操作:

  • 索引
  • 切片
  • 追加
  • 删除
  • 长度
  • 切片
  • 循环
  • 包含

5、元组(不可变列表)
创建元组:

ages = (11, 22, 33, 44, 55)
或
ages = tuple((11, 22, 33, 44, 55))

6、字典

  • 无序
  • key值唯一

创建字典:

person = {"name": "mr.wu", 'age': 18}
或
person = dict({"name": "mr.wu", 'age': 18})

字典的用法:

# 字典的增删改查# 定义一个字典demo = {"1": 1, "2": 2, 3: "3", }# 增  key必须【唯一】,如果重复添加,则value 为最后一次的值
demo["4"] = 5
demo["4"] = 4# 通过结果可以看出来 字典是【无序】的
print("增加", demo)  # 结果: 增加 {'2': 2, '1': 1, 3: '3', '4': 4}# 查
# 第一种,必须确保其存在的时候可以使用,如果不存在直接报错
print("查看", demo[3])  # 结果:查看 3
# 第二种,无论存不存在都返回结果
print("存在查找", demo.get(3))  # 结果: 存在查找 3
print("不存在查找", demo.get(5))  # 结果: 不存在查找 None# 改
demo[3] = "三"
print("修改", demo)  # 结果:修改 {'2': 2, '1': 1, 3: '三', '4': 4}# 删除
# del 不是列表 或者字典的方法,而是python的通用方法
del demo[3]
print("删除1", demo)  # 结果:删除1 {'2': 2, '1': 1, '4': 4}
demo.pop("1")
print("删除2", demo)  # 结果:删除2 {'2': 2, '4': 4}# 删除的第三种方法为随机删除
demo.popitem()
print("删除3", demo)  # 结果:删除3 {'2': 2}# 判断 该元素是否存在在字典中
print('6' in demo)  # 结果 :False  【python2 中使用 .has_key("6")】# 多节嵌套
city = {"北京": {"朝阳": ["望京", "国贸", "四惠"], "海淀": ["西二旗", "白石桥"]}, "河北": {"廊坊": ["大厂", "燕郊"]}}
print("多级嵌套", city)  # 结果 : 多级嵌套 {'河北': {'廊坊': ['大厂', '燕郊']}, '北京': {'海淀': ['西二旗', '白石桥'], '朝阳': ['望京', '国贸', '四惠']}}# 多级嵌套修改
# 修改北京 朝阳 望京  为 北京 朝阳 酒仙桥
city["北京"]["朝阳"][0] = "酒仙桥"print("多级嵌套修改", city)  # 结果:多级嵌套修改 {'北京': {'朝阳': ['酒仙桥', '国贸', '四惠'], '海淀': ['西二旗', '白石桥']}, '河北': {'廊坊': ['大厂', '燕郊']}}# 多级嵌套添加
# 添加北京朝阳新地区 来广营
city["北京"]["朝阳"].append("来广营")
print("多级嵌套添加",city)  # 结果:  {'北京': {'海淀': ['西二旗', '白石桥'], '朝阳': ['酒仙桥', '国贸', '四惠', '来广营']}, '河北': {'廊坊': ['大厂', '燕郊']}}demo2 = {"1": 1, "2": 2, 3: "3", }# key 将其所有key 打印出来
print("key值为:", demo2.keys())  # 结果:key值为: dict_keys([3, '1', '2'])# value 将其所有value 打印出来
print("value值为:", demo2.values())  # 结果:value值为: dict_values(['3', 2, 1])# update
demo3 = {1: "一", 2: "二", 3: "三", }
demo2.update(demo3)
# 如果demo3中的key和demo2中的一直,那么将demo3中的value赋值给demo2,如果没有,则在demo2中新增
print("update", demo2)  # 结果:update {3: '三', 1: '一', 2: '二', '2': 2, '1': 1}# 字段转列表
demo2.items()
print("字典转列表", demo2)  # 结果: 字典转列表 {'2': 2, 1: '一', 2: '二', 3: '三', '1': 1}# 初始化新字典
demo4 = dict.fromkeys([1, 2, 3], [888, {"name": "GPF"}, 888])
print("初始化新字典",demo4)  # 结果:初始化新字典 {1: [888, {'name': 'GPF'}, 888], 2: [888, {'name': 'GPF'}, 888], 3: [888, {'name': 'GPF'}, 888]}
# 坑
# 修改key=1 的value,也就是修改[888, {'name': 'GPF'}, 888],将 name对应的value 修改为 lzb
demo4[1][1]["name"] = "lzb"
# 我们只修改一个地方,但是其他的方跟着也修改了。 原因是因为这三个key  都共享一个结果
print("坑,修改后的结果",demo4)  # 结果:坑,修改后的结果 {1: [888, {'name': 'lzb'}, 888], 2: [888, {'name': 'lzb'}, 888], 3: [888, {'name': 'lzb'}, 888]}##循环
# 方法1
for i in demo4:print(i, demo4[i])  # 1 [888, {'name': 'lzb'}, 888]# 2 [888, {'name': 'lzb'}, 888]# 3 [888, {'name': 'lzb'}, 888]# 方法2
for k,v in demo4.items():print(k,v)          # 1 [888, {'name': 'lzb'}, 888]# 2 [888, {'name': 'lzb'}, 888]# 3 [888, {'name': 'lzb'}, 888]# 从结果上看 方法1 和方法2 是一样的,但是 方法1 相对于方法2 高效许多,原因是 方法2 需要先将字典转化为 列表 ,在进行循环

七、数据运算

数据运算:

运算符 描述 实例
+ 加 - 两个对象相加 a + b 输出结果 30
- 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10
* 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 200
/ 除 - x除以y b / a 输出结果 2
% 取模 - 返回除法的余数 b % a 输出结果 0
** 幂 - 返回x的y次幂 a**b 为10的20次方, 输出结果 100000000000000000000
// 取整除 - 返回商的整数部分(向下取整) 9//2 == 4 -9//2 = -5

比较运算:

运算符 描述 实例
== 等于 - 比较对象是否相等 (a == b) 返回 False。
!= 不等于 - 比较两个对象是否不相等 (a != b) 返回 true.
<> 不等于 - 比较两个对象是否不相等 (a <> b) 返回 true。这个运算符类似 != 。
> 大于 - 返回x是否大于y (a > b) 返回 False。
< 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。 (a < b) 返回 true。
>= 大于等于 - 返回x是否大于等于y。 (a >= b) 返回 False。
<= 小于等于 - 返回x是否小于等于y。 (a <= b) 返回 true。

赋值运算:

运算符 描述 实例
= 简单的赋值运算符 c = a + b 将 a + b 的运算结果赋值为 c
+= 加法赋值运算符 c += a 等效于 c = c + a
-= 减法赋值运算符 c -= a 等效于 c = c - a
*= 乘法赋值运算符 c *= a 等效于 c = c * a
/= 除法赋值运算符 c /= a 等效于 c = c / a
%= 取模赋值运算符 c %= a 等效于 c = c % a
**= 幂赋值运算符 c **= a 等效于 c = c ** a
//= 取整除赋值运算符 c //= a 等效于 c = c // a

逻辑运算:

运算符 描述 实例
and x and y 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 (a and b) 返回 20。
or x or y 布尔"或" - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。 (a or b) 返回 10。
not not x 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 not(a and b) 返回 False

成员运算:

运算符 描述 实例
in 如果在指定的序列中找到值返回 True,否则返回 False。 x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in 如果在指定的序列中没有找到值返回 True,否则返回 False。 x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

身份运算:

运算符 描述 实例
is is 是判断两个标识符是不是引用自一个对象 x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False
is not is not 是判断两个标识符是不是引用自不同对象 x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。

位运算:

运算符 描述 实例
& 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 (a & b) 输出结果 12 ,二进制解释: 0000 1100
| 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 (a | b) 输出结果 61 ,二进制解释: 0011 1101
^ 按位异或运算符:当两对应的二进位相异时,结果为1 (a ^ b) 输出结果 49 ,二进制解释: 0011 0001
~ 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1 (~a ) 输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式。
<< 左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。 a << 2 输出结果 240 ,二进制解释: 1111 0000
>> 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数 a >> 2 输出结果 15 ,二进制解释: 0000 1111

运算符优先级:

运算符 描述
** 指数 (最高优先级)
~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % // 乘,除,取模和取整除
+ - 加法减法
>> << 右移,左移运算符
& 位 ‘AND’
^ | 位运算符
<= < > >= 比较运算符
<> == != 等于运算符
= %= /= //= -= += *= **= 赋值运算符
is is not 身份运算符
in not in 成员运算符
not and or 逻辑运算符

这里总结的不全,如果想看更多内容,猛击这里

八、表达式if … else

场景一、用户登陆验证

# 提示输入用户名和密码# 验证用户名和密码
#     如果错误,则输出用户名或密码错误
#     如果成功,则输出 欢迎,XXX!#!/usr/bin/env python
# -*- coding: encoding -*-import getpassname = input('请输入用户名:')
pwd = getpass.getpass('请输入密码:')if name == "gpf" and pwd == "cmd":print("欢迎,gpf!")
else:print("用户名和密码错误")

九、表达式for loop

最简单的循环10次

#_*_coding:utf-8_*_
__author__ = 'gpf'for i in range(10):print("loop:", i )

需求一:还是上面的程序,但是遇到小于5的循环次数就不走了,直接跳入下一次循环

for i in range(10):if i<5:continue #不往下走了,直接进入下一次loopprint("loop:", i )

需求二:还是上面的程序,但是遇到大于5的循环次数就不走了,直接退出

for i in range(10):if i>5:break #不往下走了,直接跳出整个loopprint("loop:", i )

十、表达式 while loop

有一种循环叫死循环,一经触发,就运行个天荒地老、海枯石烂。

海枯石烂代码

count = 0
while True:print("你是风儿我是沙,缠缠绵绵到天涯...",count)count +=1

其实除了时间,没有什么是永恒的,死loop还是少写为好

上面的代码循环100次就退出吧

野外拓展

三元运算

result = 值1 if 条件 else 值2

如果条件为真:result = 值1
如果条件为假:result = 值2

以上为python的基础知识,以后会慢慢增加~ 学python 我们是认真的!

python3之路 基础相关推荐

  1. python3之路 基础-协成

    协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来 ...

  2. python3基础语法-Python3的一些基础语法介绍和理解

    作者:心叶 时间:2018-04-23 22:18 此处长期维护一些对帮助快速使用python3的一些基础语法,方便日常算法练习使用. 控制语法 break 语句可以跳出 for 和 while 的循 ...

  3. Python3——网络编程基础

    Python3--网络编程基础 基础知识参考: https://blog.csdn.net/wqx521/article/details/51037048 https://blog.csdn.net/ ...

  4. Python3数学建模基础系列教程——生姜用户

    目录 python3数学建模基础(一)绘制各类型的图表 python3数学建模基础(二)矩阵运算 python3数学建模基础(三)实现斐波那契数列 python3数学建模基础(四)多个函数图像求交点 ...

  5. JAVA学习之路--基础篇三

    目录 关于Java中从键盘输入的语句 nextxxx().next().nextLine()的区别 语句 if和if else语句 Switch语句 for语句 while和do..while bre ...

  6. python入门004~创建属于自己的第一个python3项目~基础知识的讲解

    上一节带领大家成功的安装了pthon3,并且在开发者工具pycharm里配置了python,这一节就开始带领大家学习python3的基础知识了. 如果你还没有安装python3,也没有安装开发者工具p ...

  7. python学习之路基础篇(第四篇)

    一.课程内容回顾 1.python基础 2.基本数据类型  (str|list|dict|tuple) 3.将字符串"老男人"转换成utf-8 s = "老男人" ...

  8. python3入门书籍-零基础自学python3 好用的入门书籍推荐

    零基础自学python3 好用的入门书籍推荐,博学谷小班整理了六本数,推荐阅读 <Python for data analysis>.<Python数据分析与挖掘实战>.< ...

  9. python3下载教程-Python3完全零基础入门精讲 全套视频教程

    零基础小白快速学程序员大爱语言�D�DPython,易学易用易就业!!! 目标人群: 熟悉电脑基本操作,编程零基础或已具备Python或其它编程语言的人群. 课程目标:绝对零基础Python3.x 入 ...

最新文章

  1. arduino下载库出错_【arduino】DIY音乐播放器,arduino播放wav音乐,TRMpcm库测试及使用...
  2. MPB:亚热带生态所葛体达组-原位酶谱法高分辨率实时检测土壤微界面酶活分布...
  3. 【STM32 .Net MF开发板学习-17】Wifi遥控智能小车
  4. 网络推广下叮咚买菜已完成D轮融资,生鲜电商下一次融资又在何方?
  5. php怎麼讲$字段的值截取第一个字,PHP截取中文字符串方法总结
  6. [系统安全] 四.OllyDbg动态分析工具基础用法及Crakeme逆向破解
  7. Tkinter Helloword !
  8. opengl如何画出一个球_少儿美术绘画教程:毛线球
  9. 国家网信办:所有网站应对传播内容承担法律责任
  10. apm飞控制作_传统直接转矩控制
  11. 【SICP练习】102 练习2.79-2.80
  12. performSelector:withObject:afterDelay: 的用法
  13. 嵌入式基础面八股文——进程与线程的基本概念(1)
  14. 《软件工程实践》第一次作业 之第3题
  15. Duplicate Photos Fixer Pro for Mac用户指南:我可以比较不同时间的照片吗?
  16. qdir 类似工具_实用工具——多窗口资源管理器qdir
  17. Centos7 [Errno 14] curl#37 - Couldn't open file /mnt/Packages/repodata/repomd.xml
  18. vue + openlayers鼠标移动获取地图经纬度格式化的两种方式
  19. 银行业务--负债业务
  20. 互联网评论(一):由“戴尔用博客与中国用户沟通”想起

热门文章

  1. 原来csdn的用户名不能修改,昵称可以修改
  2. ubuntu 18.04多应用窗口切换的快捷键使用指南
  3. 在WordPress后台文章编辑器添加首行缩进2字符的按钮
  4. 已解决ImportError: DLL 1oad failed while importing, onnxruntime_pybind11_state: 参数错误。
  5. DUToj1085 Water Problem(矩阵快速幂)
  6. VSCode配置基于java + LeetCode环境
  7. 利用Android传感器开发指南针
  8. 计算机图形学——生成直线的DDA算法
  9. 编程神奇算法_分类算法的神奇介绍
  10. 玩转STM32(17)理解SystemInit函数