第1章 Python介绍
1.1 python应用领域
python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域,目前业内几乎所有大型互联网企业都在时用python。
1.1.1 目前python主要领域
- 云计算:云计算最火的语言,典型应用openstack。
- WEB开发:众多优秀的web框架,众多大型网站均为python开发,典型web框架Django。
- 科学运算、人工智能:典型开发库numpy、scipy、matplotlib、enthought、libarys、pandas等。
- 系统运维:自动化开发。
- 金 融:量化交易、金融分析,不仅仅在用python,还在逐年提高,原因就是作为动态语言的python,语言结构清晰简单,库丰富,成熟稳定,科学计算和统计分析都很牛逼,生产效率远远高于c、c++、java,尤其是擅长策略回测。
1.2 python是一门什么样的语言?
编程语言主要从以下几个角度进行分类,编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语言,每个分类代表的意思如下:
1.2.1 编译和解释的区别
因为计算机不能直接认识并执行我们写的语言代码,它只能认识机器语言,既0、1代码二进制的形式。
1、编译器
是吧源代码的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以计算机语言来运行此程序,速度很快。
举个栗子:中国人和美国人对话,由于语言的不通,需要一个翻译,中国人有钱就雇一个翻译来进行翻译语言,即这个翻译就是编译器,中国人每说一次事后,翻译官是将中国人所有说的话提前翻译好成英文,并写在文件中,然后交给美国人看,这样美国人就很快的并且以母语的形式方便看完。这就叫编译型,一次性提前编译好。
2、解释器
解释器是在执行程序时,才一条一条的解释成机器语言给计算机逐一执行,所以运行速度相对编译后的程序运行的慢。
举个栗子:还是一个中国人和美国人,在交流的时候在现场有个翻译官,中国人说一句,翻译官翻译一句,即翻译官就是解释器。
1.2.2 低级语言和高级语言
1、低级语言
一句话说,低级语言就是面向机器、更接近底层的语言。
即0、1序列表示的机器指令都是用来符号助记,这些与机器指令一一对应的助记符就时汇编指令,无论是机器指令还是汇编指令都是面向机器的,统称为低级语言。
2、高级语言
一句话说,高级语言就是面向人类思维逻辑开发的语言。
抽象程度大大提升,需要经过编译成特定机器的汇编代码才能执行,一条高级语言的语句往往需要若干机器指令来完成,高级语言独立于机器的特性是靠编译器为不同机器生成不同的目标代码(或机器指令)来实现的,那具体的说,要将高级语言编译到什么程度呢?这要跟编译技术有关了,既可以编译成直接可执行多目标代码,也可以编译成一种中间表示,然后拿到不同的机器和系统上执行,这种情况通常又需要支撑环境,比如解释器或虚拟机的支持,java程序编译成bytecode,再由不同平台的虚拟机执行就是很好的例子,而通过编译器解释的到多目标代码去适应不同的机器,从这个意义上来说,通过交叉汇编,一些汇编程序也可以获得不同机器的可移植性,但这种途径的可移植性远远不同高级语言来的方便和实用性大。
3、低级语言与高级语言小结
- 低级语言是更接近底层的语言。
- 高级语言是更接近人类思维逻辑的语言。
- 计算机只识别0、1代码,而人类有自己的语言,因此需要编译器或解释器来编译成0、1代码或者中间语言。
1.2.3 动态语言和静态语言
通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。
1、动态类型语言
动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来,python和ruby就是这种典型的动态类型语言。
2、静态类型语言
静态类型语言与动态类型语言刚好相反,它的数据类型在编译期间检查的,也就是说在程序时要声明所有变量的数据类型,c、c++是静态类型语言的典型代表,其他的静态类型语言还有c#、java等。
1.2.4 强类型定义语言和弱类型定义语言
1、强类型定义语言
强制数据类型的语言,也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么他就永远是这个类型,举个栗子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理,强类型定义语言是类型安全的语言。
2、弱类型定义语言
数据类型可以被忽略的语言,它与强类型定义语言相反,一个变量可以复制不同数据类型的值。
1.2.5 python总结
python时动态语言,强类型定义语言。
1.3 python的优缺点
1.3.1 python的优点
1、简单明确
python定位就是优雅、明确、简单,所以python程序看上去总是简单易懂,初学者python,不但入门容易,而且将来深入下去,可以编写哪些非常复杂的大程序。
2、开发效率非常高
python有非常强大的第三方库,基本上你想通过计算机实现任何功能,python官方库里都有相应的模块进行支持,直接下载调用后,在基础库的基础上再进行开发,大大降低开发周期,避免重复造轮子。
3、高级语言
当你用python语言编写程序的时候,你无需考虑诸多如何管理你的程序使用等内存一类的底层细节。
4、可移植性
由于它对开源本质,python已经被移植到许多平台上,(经过改动使它能够工作在不同平台上。)
5、可扩展性
如果你需要你的一段关键代码运行的更快活着希望某些算法不公开,你可以把你的部分程序用c或者c++编写,然后再你的python程序中使用。
6、可嵌入性
你可以把python嵌入你的c/c++程序中,从而醒你对程序用户提供脚本功能。
1.3.2 python缺点
1、速度慢
python的运行速度相比c语言确实慢很多,跟java相比也要慢一些,但是python的慢一般用户是无法直接感知到的,并且现在不断的完善。
2、代码不能加密
因为python是解释性语言,它的源码都是以明文对形势存在的。
3、线程问题
线程不能利用多cpu问题,GIL(global interpreter lock)即全集解释器锁,是计算机程序设计语言解释器用语同步线程的工具,使得任何时刻仅有一个线程在执行,python的线程时操作系统的原成线程,在linux上为pthread,在windows上为win thread,完全由操作系统调度线程的执行,一个python解释器进程内有一条主线成,以及多用户程序执行线程,即使在多核CPU平台上,由于GIL的存在,所以禁止多线程的并行执行,关于这个问题的折衷解决方法。
1.4 python解释器
当我们编写python代码时,我们得到的是一个包含python代码的以.py为扩展名到文本文件,要运行代码,就需要python解释器去执行.py文件。
由于整个python语言从规范到解释器都是开源的,所以理论上,只要水平够高,任何人都可以编写python解释器来执行python代码,事实上,确实存在很多种python解释器。
1、CPython
当我们从python官方网站下载并安装好python2.7后,我们就直接获得来一个官方版本的解释器CPython,这个解释器使用c语言开发,所以叫cpython,在命令行训醒python就是启动cpython解释器。
cpython是使用最为广泛的python解释器。
2、IPython
IPython是基于cpython之上多个交互式解释器,也就是说,IPython只在交互式上有所增强,但是执行python代码的功能和cpython是完全一样的,好比很多国家浏览器虽然外观不同,但内核其实都是调用了ie。
cpython用>>>作为提示符,而IPython用In[序号]:作为提示符。
3、pypy
pypy是另一种python解释器,他的目的是执行速度,pypy采用jit技术,对python代码进行动态编译(注意不是解释),所以可以显著提高python代码到执行速度。
绝大部分python代码都可以在pypy下运行,但是pypy和cpython有一些是不同的,这就导致形同的python代码在两种解释器下执行可能会有不同的结果,如果你的代码要放在pypy下执行,就需要了解pypy和cpython的同点。
4、Jython
Jython是运行在java平台上的python解释器,可以直接把python代码编译成java字节码执行。
5、ironpython
ironpython和jython类似,只不过是运行在微软.net平台的python解释器,可以直接把python代码编译成.net字节码。
1.4.1 python解释器小结
python的解释器很多,但使用最广泛的还是cpython,如果要和java或者.net平台交互,最好的办法不是用jython或者ironpython,而是通过网络调用来交互,确保各程序之间的独立性。
第2章 Python简单基础
2.1 变量
1、变量的定义
变量是一个在内存存储的数据。
2、变量的意义
为什么要有变量,因为他保存程序的中间结果或状态,以供应后面的代码进行调用。
2.1.1 变量的要求定义
1、等号右边永远是变量名
2、打印字符串时使用双引号
3、打印时的分隔符使用逗号
4、在变量中数字不需要加引号,加引号就变成字符串了
5、python是由上到下逐行(hang)处理执行的,因此变量要先定义好再调用
2.1.2 定义变量的方式
1、定义变量简洁化标准:强烈推荐“_”下划线,其次也可以是用驼峰表示法。
2、变量不可全部大写,全部大写为常量,常量是永远不变的变量,如果程序中有永远不变的量,可以使用大写来暗示别人或提醒自己。
3、变量不能以数字开头,数字可以在变量名的中间。
4、变量名不能使用特殊字符,仅除下划线。
5、不能使用关键字作为变量名,关键字就是程序内部语法,如:print等。
2.1.3 变量赋值实例
1、正确打印
1 #!/usr/bin/env python3
2 name = "chenx"
3 name2 = "oldboy"
4 print name,name2
输出结果:
chenx oldboy
2、错误打印
1 #!/usr/bin/env python3
2 name = "chenxin"
3 name2 = "oldboy"
4 print "name,name2"
输出结果:
name,name2
备注:变量饮用不可使用引号引用。
2.2 字符编码
由于计算机只能识别0、1代码,因此字符编码由2**8表示,每个字符有8个比特位,一个二进制数字占1比特bit,因此一个字符有8比特,即1字节,加入各国符号后出现了万国编码(unicode),每个字符有4字节,最后演变成utf-8,可变长的编码集,英文按照ascll存储,一个字符为1字节,一个中文存3字节,欧洲2字节。
python的开发规范,每行不能超过80个字符。
python2默认不支持中文,python3版本以上使用了utf-8,默认就支持中文,如果是python2必须在代码中做字符集的声明:
1 #!/usr/bin/env python2
2 # _*_ coding: utf-8 _*_
3 print ("你好")
2.3 交互式输入
2.3.1 python3.0中
1 #!/usr/bin/env python
2 name = input("what is your name:")
3 print ("holle" + name)
2.3.2 python2.0中
raw_input就是3.0中点input。
但是在2.0中也有一个input,这个input不能输入字符串,只能输入变量和数字。(没什么卵用。)
2.3.3 格式化输出占位符
#!/usr/bin/env python
name = input("your name :")
age = int(input("your age :"))
job = input("your jpb :")
meg = '''
这是%s的基本信息。
-------------------
name : %s
age : %d
job : %s
---------end-----
''' % (name,name,age,job)
print(meg)
小结:
%s:表示输出字符串
%d:表示输出整数
%f:表示输出浮点数(小数)
2.4 常用模块使用
2.4.1 getpass
#!/usr/bin/env python
import getpass
username = input("usename:")
password = getpass.getpass("password:")
print(username,password)
备注:getpass模块使密码变成不可见形式体现,但是在pycharm中不好使,只能在命令行中使用。
2.4.2 os
1、模块方法
os.system() :直接调用系统命令
os.mkdir() :在python脚本或进入pyrhon的目录下创建目录
os.popen("df -h").read() 保存输出结果
2、模块实践
#!/usr/bin/env python3
import os
os.mkdir("python_mkdir")
os_system = os.system("ls")
print(os_system)
os_popen = os.popen("df -h").read()
print(os_popen)
输出结果:
{0:21}~/s15/scripts ➭ python3 os.py
1.txt openfile.py os.py python_mkdir test_1.py
0
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/disk1 112Gi 109Gi 2.9Gi 98% 28568128 753598 97% /
devfs 182Ki 182Ki 0Bi 100% 630 0 100% /dev
map -hosts 0Bi 0Bi 0Bi 100% 0 0 100% /net
map auto_home 0Bi 0Bi 0Bi 100% 0 0 100% /home
2.4.3 sys
1、模块方法
sys.path :查看python默认存放模块的路径(全局环境变量)
2、模块实践
#!/usr/bin/env python3
import sys
print(sys.path)
直接结果:
{0:26}~/s15/scripts ➭ python3 sys.py
['/Users/cx/s15/scripts', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages']
2.4.4 python命令行补全模块
1、for mac
import sys
import readline
import rlcompleter
if sys.platform == 'darwin' and sys.version_info[0] == 2:
readline.parse_and_bind("bind ^I rl_complete")
else:
readline.parse_and_bind("tab: complete") # linux and python3 on mac
2、for linux
#!/usr/bin/env python
# python startup file
import sys
import readline
import rlcompleter
import atexit
import os
# tab completion
readline.parse_and_bind('tab: complete')
# history file
histfile = os.path.join(os.environ['HOME'], '.pythonhistory')
try:
readline.read_history_file(histfile)
except IOError:
pass
atexit.register(readline.write_history_file, histfile)
del os, histfile, readline, rlcompleter
备注:将自定义模块放在统一的python默认环境变量下,并随便命名即可,以备后面方便调用。
2.5 if判断语句
1、简单用户登录判断
#!/usr/bin/env python
user = 'chenx'
passwd = 'cx199222814'
username = input("username:")
password = input("password:")
if user == username:
print("username is correct...")
if password == passwd:
print("welcom to...")
else:
print("密码错误")
else:
print("用户名错误"
2、登录优化代码
#!/usr/bin/env python
user = 'chenxin'
passwd = 'cx1994814'
username = input("username:")
password = input("password:")
if user == username and password == passwd:
print("欢迎使用")
else:
print("用户名密码错误")
3、猜年龄代码(联合判断)
#!/usr/bin/env python
age = 21
age_num = int(input("input your age:"))
if age == age_num:
print("回答正确")
elif age > age_num:
print("猜小了")
else:
print("猜大了")
2.6 for循环
1、猜年龄循环不能超过三次
#!/usr/bin/env python
age = 21
for i in range(10):
if i <3 : #循环判断不能超过三次
age_num = int(input("input your age:"))
if age == age_num:
print("回答正确")
break
elif age_num < age:
print("猜小了")
else:
print("猜大了")
else:
print("猜测次数太多,你太笨了。。。")
break
2、猜年龄代码优化v2
#!/usr/bin/env python
age = 21
counter = 0
for i in range(10):
print("---->counter:",counter)
if counter <3: #循环判断不能超过三次
age_num = int(input("input your age:"))
if age == age_num:
print("回答正确")
break #终止整个循环,
elif age > age_num:
print("猜小了")
else:
print("猜大了")
else:
conuter_confim = input("你是否确认继续猜y/n?")
if conuter_confim == "y":
counter = 0
continue #跳出当次循环
else:
exit("再见笨蛋")
counter += 1 #counter = counter +
2.6 while循环
有一种循环叫死循环,一经触发,就运行个天荒地老、海枯石烂。
2.6.1 海枯石烂代码
count = 0 while True: print("你是风儿我是沙,缠缠绵绵到天涯...",count) count +=1
2.6.1 循环100次的代码
count = 0 while True: print("你是风儿我是沙,缠缠绵绵到天涯...",count) count +=1 if count == 100: print("去你妈的风和沙,你们这些脱了裤子是人,穿上裤子是鬼的臭男人..") break
2.6.1 循环到3次终止的代码
#!/usr/bin/env python # -*- coding: utf-8 -*- my_age = 20 count = 0 while count < 3: user_input = int(input("input your guess num:")) if user_input == my_age: print("Congratulations, you got it !") break elif user_input < my_age: print("Oops,think bigger!") else: print("think smaller!") count += 1 # 每次loop 计数器+1 else: