一、Python介绍
1.python擅长领域:
WEB开发:Django. pyramid. Tornado. Bottle. Flask. WebPy
网络编程:Twisted(牛逼异步网络框架). Requests. Scrapy. Paramiko(模拟SSH)
科学运算:Scipy. Pandas(金融). Ipython
GUI图形开发:wxPython. PyQT. Kivy(做多点触屏)
运维自动化:OpenStack. SaltStack. Ansible(RedHat两个亿收购). 腾讯蓝鲸
2.运维会开发后可以干什么?
开发自动化工具,定制开源软件
帮助评估和优化业务技术架构
开发内部系统
做全栈工程师
3.编译型和解释型
编译型:就是C或C++语言这种,每个源代码文件先又编译器(Compiler)编译为目标文件,目标文件基本已经是可执行代码了,但是由于每个目标文件都是整个项目的一个组成部分,所以还需要另外一个程序将所有的目标文件以及各种资源,例如图标、声音文件等连接起来,该程序叫做链接程序(linker)。链接完成后就可以得到我们所需要的可执行文件,例如Windows下的exe文件。
解释型:与编译型不同的是,翻译的时机不同。编译型类似读一本外语书,先找一个人把其翻译为母语版,然后再阅读。解释型就是一句一句翻译,如果你想回看某个章节,他也得重新给翻译。
解释型的代码更容易移植。
由于解释型程序是将编译的过程放到执行过程中,这就决定了解释型程序注定要比编译型慢,几百倍的速度差不足为奇。
JAVA:实际上也属于解释型语言,但是JAVA会先把源代码预编译为字节码,字节码是介于机器语言和源代码之间的中间代码。运行的时候有JVM(JAVA虚拟机)来解释执行。他既保留了代码的高抽象、可移植的特点,又完成了对源代码的大部分预编译工作,所以执行起来比纯解释型程序要快许多。
4.动态语言和静态语言
动态语言:指在运行期间才做数据类型检查的语言,也就是说,在用动态语言编程时,永远不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言。
静态语言:静态语言与动态语言刚好相反,它的数据类型是在编译期间检查的,也就是说在写程序时就要声明所有变量的数据类型,C/C++是静态语言的典型代表,其他的静态类型语言还有C#、JAVA等。
5.强类型定义语言和弱类型定义语言
强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定为了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型。
弱类型定义语言:数据类型可以被忽略的语言。一个变量可以赋值不同数据类型的值。
强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能有效的避免许多错误。另外,“该语言是不是动态语言”和“该语言是否类型安全”之间是没有联系的。例如,Python是动态语言,是强类型语言。VBScript是动态语言,是弱类型语言。JAVA是静态语言,是强类型语言。
6.Python优缺点
优点:
- Python“优雅、明确、简单”,易学。
- 开发效率高:Python有强大的第三方库,几乎可能支撑你实现任何功能。直接下载挑用后,大大降低开发周期,避免重复造轮子。
- 高级语言:无需开率内存释放等问题。
- 可移植性:如果避免使用依赖于系统的特性,那么你的所有Python程序无需修改就可以在几乎所有的系统平台上运行。
- 可扩展性:如果你需要你的一段关键代码运行得更快,或者某些算法不想公开,你可以把你的部分程序使用C/C++编写,然后在Python中调用他们。
- 可嵌入性:你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。
缺点:
- 速度慢:比C慢很多,但是大多数时候用户是无法直接感知到的。除非你要写对速度要求很高的需求。
- 代码不能加密:Python是解释型语言,源码明文形式存放,如果项目要求代码是加密的,一开始就不要选择Python来开发。
- 线程不能利用多CPU优势:由于GIL的存在(Global Interpreter Lock),是计算机程序设计语言解释器用于同步线程的工具。Python的线程是操作系统的原生线程,在Linux上为pthread,在Windows上为Win thread。即使在多核CPU平台上,由于GIL的存在,所以禁止多线程的并行执行。
7.Python解释器
我们编辑.py文本文件。要运行代码就需要Python解释器去执行.py文件。
种类:
- CPython:Linux自带的解释器,例如Pyhton2.7。就是一个CPython,这个解释器是用C语言开发的,所以叫CPython。CPyhton是使用最广的Python解释器,教程的所有代码都在CPython上运行。
- IPython:CPython基础上的一个交互解释器。
- PyPy:目标是执行速度。采用JIT(即时编译技术),对Python代码进行动态编译(注意不是解释),所以可以显著提高Python的执行速度。绝大部分Python代码都可以在PyPy下运行,但是和CPython有一些是不同的,这就导致相同的Python代码在两种解释器下执行可能会有不同的结果。如果你的代码要放到PyPy下执行,就需要了解与CPython之间的不同点。
- Jython:是运行在JAVA平台上的Python解释器,可以把Python代码编译成JAVA字节码。
8.Pyhton2.x和Pyhton3.x
Pyhton2.7只支持到2020年。Python3.x与Python2.x之间的最大的变动在于,Python3.x支持Unicode,即直接直接使用中文。某些库改名了。Django已经支持3.x,Twisted是一个牛逼的异步网络框架,目前还不支持3.x。
二、Hello World
1 #!/usr/bin/env python 2 print("hello world!")
当该.py文件需要修改权限为可执行文件时(Linux下),则必须在文件开始加上#!/usr/bin/env python,类似shell脚本。或者写为#!/usr/bin/python。前者是查找环境变量,后者是写死找某个目录里的,推荐使用前者。如何使用前者,安装一个python,然后在环境变量中变为默认的Python,使用前者就可以了。
三、开发工具
PyCharm工具
默认模板配置:即在每个py文件的最前面自动添加信息。
如何配置:在File下的Setting,或者在View下打开toolbar,点击Setting进入配置界面,然后在Editor下的File and Code Template选择Python Script文件,在右边的编辑栏中填入你要默认生成的模板信息。
配置开发工具的编码:在setting里,Editor->File Encodings,Default encoding for properties files默认为GBK,修改为UTF-8。将顶部的Project Encoding也修改为UTF-8。
四、变量
eg.1:
name = "Leo Zheng" name2 = name name = "Jack Chen" print(name , name2)
打印结果:Jack Chen Leo Zheng
分析:print中的逗号,用于分割name和name2,为空格。和print(name+name2)不同,后者没有分割空格。
内存分析:首先name变量指向内存中存放的"Leo Zheng",当name2=name时,name2也指向内存中的该值。然后name="Jack Chen"时,name指向了另一块内存存放的"Jack Chen",但name2还是指向的"Leo Zheng"。
变量定义规则:变量名只能是字母、数字或下划线的任意组合,变量名的第一个字符不能是数字,中间不能有空格,不能有特殊字符。关键字不能作为变量名,例如“and”“as”“assert”“if”“else”等等。
约定俗成:不要用中文做变量名(虽然可以),不要使用拼音,不要使用无愿意字符比如a、a1等。使用gf_of_leo比较好,leo的女朋友,官方建议。
变量和常量:Python中没有常量的概念,使用全部大写来表示常量(但是是可以修改的),例如圆周率PIE=3.1415926。
五、字符编码
ASCII码(美国标准信息交换代码):最多只能使用8bit,256个代码。包含大写小写字母、数字和一些特殊字符。先使用了128个,预留了128-255。
GB2312:1980年诞生,7000多个汉字,利用ASC码中预留的128-255之间的部分形成索引,然后另外指定一张中文表,即GB2312。
GBK1.0:1995年诞生,兼容GB2312,扩展了2W多个。
GB18030:2000年诞生,收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等少数民族文字。
都是向下兼容的。
Windows缺省内码是GBK,可以通过GB18030包升级到GB18030。
Unicode:90年代初,由于除了中国,还有日本韩国,GBK无法与其他语言兼容,则出现了万国码Unicode。Unicode占16bit。
Utf-8:可变长度的Unicode。所有的英文字符实际上存的是ASCII码为
1个字节,存中文会使用
3个字节。
Python3.x默认使用utf-8处理字符,Pyhton2.x中无法字节处理中文,默认使用ASCII码处理。若要处理中文,需要在每个py文件前面加上
# -*- coding:utf-8 -*-
六、注释
#:使用#注释单行代码,
""" """:使用""" """注释多行代码。还可以使用""" """赋值给一个变量,代表一个多行的变量。
在Python中,单引号和双引号是一样的,除了一种情况,即引号嵌套的时候。例如" ' hello' "或' " World " '。
注:单引号、双引号可互相嵌套,前提是不发生混淆。
七、文本输入
username = input("UserName:") password = input("Password") print(username,password)
格式化:
方式一:
mes = """ ---------info--------- username : %s password : %s """ % (username,password)
%s代表格式化string,%d格式化数字,%f代表浮点。
方式二:
mes = """ ---------info--------- username : {_username} password : {_password} """.format(_username = username,_password = password) print(mes)
方式三:
mes = """ ---------info--------- username : {0} password : {1} """.format(username,password) print(mes)
建议使用方法一和方法二,还有一种字符串拼接法,不要使用,因为内存开辟的空间更多,而且不直观。
八、判断分支
_username = "zhengzhu" _passwd = "abc123" username = input("Username : ") passwd = input("Password : ") if username == _username and passwd == _passwd: print("Right") else: print("Error")
Python是强制缩进的。
==代表等于,=代表赋值。
九、While循环
age_of_me = 31 count = 0 while count < 3: guess_age = input("Guess my Age : ") guess_age = int(guess_age) if guess_age > age_of_me: print("大了") elif guess_age < age_of_me: print("小了") else: print("对了") break count += 1
age_of_me = 31 count = 0 while count < 3: guess_age = input("Guess my Age : ") guess_age = int(guess_age) if guess_age > age_of_me: print("大了") elif guess_age < age_of_me: print("小了") else: print("对了") break count += 1 else: print("you have tried too many times..fuck off")
十、For循环
for i in range(10): print(i)
age_of_me = 31 count = 0 for i in range(3): guess_age = input("Guess my Age : ") guess_age = int(guess_age) if guess_age > age_of_me: print("大了") elif guess_age < age_of_me: print("小了") else: print("对了") break else: print("you have tried too many times..fuck off") for i in range(2,10,3): print("loop :", i)