python基础第二课

时间:2019-05-11 09:42来源:计算机教程
编译和解释的区别是什么?    编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;   而解释器则是

编译和解释的区别是什么?  

编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式) 

vnsc5858威尼斯城官网 1

 

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.01s,用Python是0.1s,这样C语言直接比Python快了10倍,算是非常夸张了,但是你是无法直接通过肉眼感知的,因为一个正常人所能感知的时间最小单位是0.15-0.4s左右。

  2. 代码不能加密,因为PYTHON是解释性语言,它的源码都是以名文形式存放的。

  3. 线程不能利用多CPU问题,这是Python被人诟病最多的一个缺点,GIL即全局解释器锁(Global Interpreter Lock),是计算机程序设计语言解释器用于同步线程的工具,使得任何时刻仅有一个线程在执行,Python的线程是操作系统的原生线程。在Linux上为pthread,在Windows上为Win thread,完全由操作系统调度线程的执行。一个python解释器进程内有一条主线程,以及多条用户程序的执行线程。即使在多核CPU平台上,由于GIL的存在,所以禁止多线程的并行执行。关于这个问题的折衷解决方法,我们在以后线程和进程章节里再进行详细探讨。

 

编译型vs解释型

编译型


 

优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。 缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。

 

解释型


 

优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。

缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。

vnsc5858威尼斯城官网 2

一  认识模块

1.1  sys

#!/usr/bin/env python3
# Author: Sam Gao
import sys
print(sys.path) #打印PYTHONPATH环境变量
# ['/home/sam/PycharmProjects/s14/day1',
# '/home/sam/PycharmProjects/s14',
# '/usr/lib/python35.zip',
# '/usr/lib/python3.5',
# '/usr/lib/python3.5/plat-x86_64-linux-gnu',
# '/usr/lib/python3.5/lib-dynload',
# '/usr/local/lib/python3.5/dist-packages',
# '/usr/lib/python3/dist-packages']

print(sys.argv)#  使用console 执行 python3 sys_mokuai.py test you are
# 结果   ['sys_mokuai.py', 'test', 'you', 'are']
print(sys.argv[2])   #  结果    you

1.2  os

import os
print(os.system("ifconfig | grep 10.100 |awk '{print $2}'"))   # 执行系统命令,,并返回状态结果
#结果
# 10.100.211.48
# 0

print(os.popen("ifconfig | grep 10.100 |awk '{print $2}'").read())  #返回命令执行的结果
#1  os.popen("ifconfig | grep 10.100 |awk '{print $2}'")  返回内存地址,即把结果存进地址,使用read()读出了
#结果
#10.100.211.48

1.3  案例 把参数当作命令执行

[root@linux-node1 ~]# cat test.py 
#!/usr/bin/env python
# -*- coding: gbk -*-
import os,sys
os.system(' '.join(sys.argv[1:]))

[root@linux-node1 ~]# python test.py ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.130.128  netmask 255.255.255.0  broadcast 192.168.130.255
        inet6 fe80::20c:29ff:fec1:295a  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:c1:29:5a  txqueuelen 1000  (Ethernet)
        RX packets 181757  bytes 20497644 (19.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 29679  bytes 2669636 (2.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Python是一门什么样的语言

八  元组

元组就是不可变的列表,只能读取,不能修改

vnsc5858威尼斯城官网,8.1  元组定义

>>> name=('Sam', 'Gao', 'jey')
>>> name
('Sam', 'Gao', 'jey')
>>> team=('ops',)
>>> team
('ops',)
>>> type(team)
<class 'tuple'>

8.2  元组只有两种方法

names = ('gao', 'sam', 'gao')
names.count('gao')
names.index('gao') 

练习 

 1 #随机一个数,猜大小,猜对结束
 2 import random
 3 str = random.randint(1,100) #随机一个1到100的数字
 4 print(str)
 5 while True:
 6     num = int(input('输入一个数字'))
 7     if num >1 and num <= 100:
 8         if num == str:
 9             print('猜对了。。。。')
10         elif num < str:
11             print('数字小了')
12         else:
13             print('数字大了')
14     else:
15         print('输入的数字不符合')

 

二  自定义模块及pyc

2.1  自定义模块

[root@linux-node1 ~]# cat test.py
#!/usr/bin/env python
print 'Hello World!'

[root@linux-node1 ~]# cat test2.py 
#!/usr/bin/env python
import test

[root@linux-node1 ~]# python test2.py
Hello World!

注:test.py 必须放在环境变量的目录里,可使用print sys.path 查询,一般放在当前目录或者放在E:Python36Libsite-packages 目录下,在E:Python36Libsite-package_pycache_   多了test.pyc

2.2  认识pyc

2.2.1  Python是一门解释型语言?

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

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

2.2.2 解释型语言和编译型语言

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

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

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

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

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

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

2.2.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是一门先编译后解释的语言。

2.2.4 简述Python的运行过程

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

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

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

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

模块初识 

Python有大量的模块,从而使得开发Python程序非常简洁。类库有包括三中:

Python内部提供的模块

业内开源的模块

程序员自己开发的模块

Python内部提供一个 sys 的模块,其中的 sys.argv 用来捕获执行执行python脚本时传入的参数

 1 import sys
 2 
 3 print sys.argv
 4 
 5 
 6 import os
 7  
 8 os.system("df -h") #调用系统命令
 9 
10 import  time
11 print(time.strftime('%Y-%m-%d',time.localtime(time.time())))
12 
13 print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))

 

注释

  当行注视:# 被注释内容

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

 

 

第一个python程序

在任意目录下创建 hello.py 文件,内容如下:
print "hello,world"
执行 hello.py 文件,即: python /home/dev/hello.py


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

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

#!/usr/bin/env python

print "hello,world"
如此一来,执行: ./hello.py 即可。

ps:执行前需给予 hello.py 执行权限,chmod 755 hello.py

 

 

格式化输出 

 1 name = input('请输入你的名字:')
 2 print('你的名字是'   name)  # 使用加号连接
 3 print('你的名字是%s' % name)  # 使用占位符  
 4 print('你的名字是{your_name}'.format(your_name=name))  # 使用format格式化输出,{}里面的名字可以随便写但是
 5 #要和后面的format中的名字保持一致,然后再把你前面定义的变量写到等号后面就可以了。
 6 age = 18
 7 print('我的名字是%s,年龄是%d岁.' %(name, age))  # 这种是里面有多个格式化内容的,前面那个是字符串,后面这
 8 #个是整数,多个变量的后面跟值的时候必须要加上括号
 9 
10 PS: 字符串是 %s;整数 %d;浮点数 %f

 

九  字典

#!/usr/bin/env python3
# encoding: utf-8
# Author: Sam Gao

info = {
    'stu1': 'gao',
    'stu2': 'liu',
    'stu3': 'ma',
    'stu4': 'cang'
}

print(info)  #  {'stu3': 'ma', 'stu1': 'gao', 'stu4': 'cang', 'stu2': 'liu'}
            # 字典是无序的

# 查找
print(info['stu2'])  #  liu   不存在则报错
print(info.get('stu1'))  #     不存在不报错,返回none

# 修改
info['stu1'] = 'wang'
print(info['stu1'])   #  wang

# 增加
info['stu5'] = 'mazi'


# 删除
del info['stu1']
info.pop('stu2')
info.popitem()  # 随便删除


# 判断
print('stu4' in info)

# 修改 增加
info = {
    'stu1': 'gao',
    'stu2': 'liu',
    'stu3': 'ma',
    'stu4': 'cang'
}
info.setdefault("stu1", "jey")  # 如果info 里面存在stu1, 则修改。不存在,则增加

info1 = {
    'stu4': 'gao',
    'stu10': 'snow'
}
info.update(info1)   # 右则修改,没有则增加


###  其它
info = {
    'stu1': 'gao',
    'stu2': 'liu',
    'stu3': 'ma',
    'stu4': 'cang'
}

print(info.items())  # dict_items([('stu4', 'cang'), ('stu1', 'gao'), ('stu3', 'ma'), ('stu2', 'liu')])  还有 keys()    values()

new_list = dict.fromkeys([1,2,3], 'test')   # {1: 'test', 2: 'test', 3: 'test'} 注: 所有的key 共享一个value   test ,即,内存地址一样的
print(new_list)

# 循环
for i in info:
    print(i)
#结果stu2
# stu4
# stu1
# stu3

for k, v in info.items():
    print(k, v)

#结果
#stu2 liu
# stu4 cang
# stu1 gao
# stu3 ma

#注: 第一种循环要比第二种循环高效很多

 

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

编辑:计算机教程 本文来源:python基础第二课

关键词: