python--1、入门

2022-12-03,

python的创始人为吉多·范罗苏姆(Guido van Rossum)。  
python在2017年统计的所有语言排名中处于第四名,稳步上升状态。

python应用领域:
WEB开发(Django框架,异步高并发的Tornado框架,短小精悍的flask,bottle)
网络编程(高并发的Twisted网络框架, py3引入的asyncio使异步编程变容易)
爬虫(Scrapy\Request\BeautifuSoap\urllib等模块)
云计算(openstack)
人工智能、科学运算( 典型库NumPy, SciPy, Matplotlib, Enthought librarys,pandas,非常适合编写 1 万行以上的项目。)
自动化运维(jumpserver、CMDB)
金融分析(量化交易,金融分析)

python是一种什么样的语言:

  编程语言主要从以下几个角度为进行分类,编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语言。(此处仅介绍编译型和解释型)
    编译型:把源码文件的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机才能以自己认识的机器语言来执行。需要编译器,类似翻译软件,调试麻烦,执行速度快。不依赖语言环境运行,跨平台差,如C,
    解释型:在执行程序时,才一条一条的解释成机器语言给计算机来执行。需要解释器,类似实时翻译,调试方便,执行效率略低。跨平台好,一份代码,到处使用,如python,

编译型vs解释型

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

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

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

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

Python的运行过程

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

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

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

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

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

 
python编译器的种类:
要运行代码,就需要Python解释器去执行python代码文件。
  CPython(官方默认的、C语言开发)、IPython(也是C写的,交互性强)、PyPy(JIT技术,动态编译,可提升执行速度)、Jython(在Java平台,可直接译成Java字节码执行)、IronPython(在微软.Net平台,可直译成 .NET执行)
 

Python的优缺点

主要优点:

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

主要缺点:

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

以己之长,较他之短。显然是毫无意义的。没有最好的,只有最适合的。

 
 python3较之python2的变动
交互采用input()
输出变为函数类型:print()
字符集改为unicode
某些库改名了:
 

Old Name

New Name

_winreg

winreg

ConfigParser

configparser

copy_reg

copyreg

Queue

queue

SocketServer

socketserver

markupbase

_markupbase

repr

reprlib

test.test_support

test.support

安装注意事项:

  安装完后一定要做环境变量,多版本时复制一个 python.exe 改为 python3.exe 来区分。
 
入门第一代码:输出“hello world”,(直接在解释器执行或写入文件指定解释器运行文件都可以)
  print(“hello world”)
#注:在Linux中想要像执行shell脚本一样执行python程序,需在python文件第一行声明运行的解释器 #!/usr/bin/env python。并给文件添加可执行权限。
         代码中出现中文要在开头处添加 #_*_coding:utf-8_*_
 
变量
 
变量:可变的量值,在主代码前定义。
  假设在写程序时有多处需要定义同一个值,若直接写值,以后在需要修改的时候需要挨个修改,效率低。若使用变量,在需要同样值的多处都使用变量,若需要修改值时直接改变量值即可。

定义变量: name = value
变量名的定义范围:只能是字母、数字、下划线的任意组合,第一个字符不能是数字,不能是python内置的关键字
#注:python内置的关键字['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']

命名误区:不要用中文拼音、不要过长、意义要明确。

定义变量要注意的: ID、value、type
#注:==比对的是value(值),is只比较的是内存地址(ID)
   解释器中变量的value相同,但value中出现特殊字符(如空格,逗号等) 时会造成id不同。
 
常量 
常量:python语法中没有定义,但程序员约定俗成用变量名全部大写代表常量。
交互式获取值:input(‘instruction’)
  不论用户输入何种类型值都会存成字符串,获取到的值一定是str类型
python2中的input()用户输入什么类型值,就存成什么类型。raw_input()等价python3 input(),

 
注释
为什么要注释:因为遗忘是一个必然的过程,为了增加代码的可读性,也方便别人理解。
分单行和多行注释, 单行注释用#,多行注释可以用三对双引号""" """
只需要在自己觉得重要或不好理解的部分加注释即可,用中英文都可,一定不能是拼音
在Linux中运行的python,必须定义的文件头
#!/usr/bin/env python
# -*- coding: utf-8 -*-

 
数据与数据类型

数据:即变量的值。变量的是用来反映/保持状态以及状态变化的,毫无疑问针对不同的状态就应该用不同类型的数据去标识
数字类型: 定义时不用引号直接输入,或用函数把数据转为数字类型
  int整形--int()   float浮点数--float()   complex复数型   long长整型(python2才有)
字符串类型:定义时需把数据用引号引起来,或用函数把数据转为字符串类型
  str()
#注意1:字符串相加的效率不高 字符串1+字符串3,并不会在字符串1的基础上加字符串2,而是申请一个全新的内存空间存入字符串1和字符串3,相当字符串1与字符串3的空间被复制了一次,
#注意2:只能字符串加字符串,不能字符串加其他类型
 

列表:数据定义在 [] 内,或者使用list()函数把数据转换为列表。存在多个元素时用逗号分隔开,每个元素可以是任意类型,其中元素是可变的
可以相互嵌套使用,取值时也可以多层取值

常用操作:

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

 
元组:数据定义在 () 内,或者使用tuple()将列表转换为元组。若只有一个元素时要在后面加逗号,存在多个元素时用逗号隔开。每个元素可以是任意类型,定义完成后元素的指向是永远不变的(例如,元组中包含list,但list的值可以改变)
可以相互嵌套使用,取值时也可以多层取值
 
字典:数据定义在 {} 内,或者使用dict()函数把数据转换为字典。用key=value形式表示一个元素,硬性规定了映射关系。用逗号(,)隔开。value可以是任意类型。
可多层嵌套使用,取值时亦可多层取值。

常用操作:

索引
新增
删除
键、值、键值对
循环
长度

 
集合
 
布尔:逻辑判断,返回TRUE或FALSE。 一般在做比较时使用。亦可判断数据是否为空或0(0,'',[] 等值均为FALSE,数据非空非0即为TRUE。)
 
#注1.可变类型:在id不变的情况下,value可以变,则称为可变类型,如列表,字典
#注2. 不可变类型:value一旦改变,id也改变,则称为不可变类型(id变,意味着创建了新的内存空间) 
 

格式化输出: 把用户输入或上层返回的值,穿插到固定格式的字符串中。
使用占位符,如:%s 字符串占位、%d 数字占位
例:
name=input('your name: ')
print('My name is %s',%name)
 

基本运算符

假设a=10 , b=20

计算

比较

赋值

逻辑

优先级

条件判断语句: if为语句开始,elif为多次不同条件判断,else为不满足上面的条件则执行。可多层嵌套

if condition :

  exec

elif condition :

  exec

else :

  exec

迭代式循环语句:for。每循环一次从数据中按顺序取出一个值,直到数据中所有值均被使用。可多层嵌套、

for i in range(0,9) :

  exec

条件循环语句:while。 条件为真则循环,条件为假则停止循环。若条件定义为True则成死循环。可多层嵌套。

while condition :

  exec

while的条件可以使用布尔值变量判断循环是否成立。在多个while嵌套需要一次退出时,可以通过修改该变量的布尔值一次控制多个循环退出。

while ...else 语句,while 后面的else 作用是当while 循环正常执行完,中间没有被break 中止的话,就会执行else后面的语句

break与continue (仅适用于循环语句)

break 执行后会跳出此循环。外层循环不会受影响。

continue  执行后跳过此循环内后面的代码,直接开始下一次循环。

练手代码:

'1 使用while循环输出1 2 3 4 5 6     8 9 10'
number=1
while number <= 10:
if number == 7 :
number+=1
continue
print(number)
number+=1 while number <= 10 :
if number != 7 :
print(number)
number+=1
'2. 求1-100的所有数的和'
number2 = 0
total2 = 0
while number2 <= 100 :
total += number2
number2+=1
print(total)
装X方法:print(sum(range(101)))
'3. 输出 1-100 内的所有奇数'
number3 = 0
total3 = 0
while number3 <= 100 :
if number3 % 2 == 1:
total3 += number3
number3+=1
装X方法:print(sum(range(1,101,2)))
'4. 输出 1-100 内的所有偶数'
number4 = 0
total4 = 0
while number4 <= 100 :
if number4 % 2 == 0:
total4 += number4
number4+=1
print(total4)
装X方法:print(sum(range(0,101,2)))
'5. 求1-2+3-4+5 ... 99的所有数的和'
number5 = 0
odd = 0
even = 0
while number5 <= 99 :
if number5 % 2 == 1:
odd += number5
else :
even += number5
number5+=1
result = odd - even
print(result)
装X方法:print(sum(range(1,100,2))-sum(range(0,100,2)))
'6. 用户登陆(三次机会重试)'
user = 'jinyudong'
password = '666666'
count = 0
while count < 3 :
username = input('user->:')
passwd = input('passwd->:')
if username == user and password == passwd :
print('login OK !')
break
count+=1
print('login count is %d' %count)
else:
print('login error!')
'7:猜数字游戏'
import random
secret = random.randint(1,99)
# print(secret)
guess = 0
count = 0
print("AHOY! i'm the Dread Pirate Roberts, and I have a secret!")
print("It is a number from 1 to 99. I'll give you 6 tries.")
while count < 6:
guess = int(input( "What's yer guess?"))
if guess < secret:
print("Too low,ye scurvy dog!")
elif guess > secret:
print("Too high,landlubber!")
else :
print("Avast! Ye got it! Found my secret,ye did!")
break
count += 1
else:
print("No more guesses! Better luck next time,matey!")
print("The secret number was",secret)
'8:猜年龄游戏升级'
import random
secret = random.randint(1,99)
guess = 0
count = 0
print("AHOY! i'm the Dread Pirate Roberts, and I have a secret!")
print("It is a number from 1 to 99. I'll give you 6 tries.")
while count < 6:
guess = int(input( "What's yer guess?"))
if guess < secret:
print("Too low,ye scurvy dog!")
elif guess > secret:
print("Too high,landlubber!")
else :
print("Avast! Ye got it! Found my secret,ye did!")
break
if count == 5 :
print("Max error number,continue place 'y',exit place 'n'")
YorN = input('-->:')
if YorN == 'y':
count=0
continue
else:
exit()
count += 1
else:
print("No more guesses! Better luck next time,matey!")
print("The secret number was",secret)

python--1、入门的相关教程结束。

《python--1、入门.doc》

下载本文的Word格式文档,以方便收藏与打印。