Python基础-week01

时间:2021-02-18 20:21:06

 

一.Python介绍

  (1).目前Python主要应用领域:

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

  (2).Python在一些公司的应用: 

  • 谷歌:Google App Engine 、code.google.com 、Google earth 、谷歌爬虫、Google广告等项目都在大量使用Python开发
  • CIA: 美国中情局网站就是用Python开发的
  • NASA: 美国航天局(NASA)大量使用Python进行数据分析和运算
  • YouTube:世界上最大的视频网站YouTube就是用Python开发的
  • Dropbox:美国最大的在线云存储网站,全部用Python实现,每天网站处理10亿个文件的上传和下载
  • Instagram:美国最大的图片分享社交网站,每天超过3千万张照片被分享,全部用python开发
  • Facebook:大量的基础库均通过Python实现的
  • Redhat: 世界上最流行的Linux发行版本中的yum包管理工具就是用python开发的
  • 豆瓣: 公司几乎所有的业务均是通过Python开发的
  • 知乎: 国内最大的问答社区,通过Python开发(国外Quora)
  • 春雨医生:国内知名的在线医疗网站是用Python开发的
  • 除上面之外,还有搜狐、金山、腾讯、盛大、网易、百度、阿里、淘宝 、土豆、新浪、果壳等公司都在使用Python完成各种各样的任务。

二.Python是怎样的一种语言?

  (1).编译和解释的区别是什么?

  编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;

  而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.

  这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式)

  Python基础-week01

  (2).编译型vs解释型

  编译型:

  优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。

  缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。

  解释型:

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

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

  (3).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左右,哈哈。其实在大多数情况下Python已经完全可以满足你对程序速度的要求,除非你要写对速度要求极高的搜索引擎等,这种情况下,当然还是建议你用C去实现的。
  2. 代码不能加密,因为PYTHON是解释性语言,它的源码都是以名文形式存放的,不过我不认为这算是一个缺点,如果你的项目要求源代码必须是加密的,那你一开始就不应该用Python来去实现。
  3. 线程不能利用多CPU问题,这是Python被人诟病最多的一个缺点,GIL即全局解释器锁(Global Interpreter Lock),是计算机程序设计语言解释器用于同步线程的工具,使得任何时刻仅有一个线程在执行,Python的线程是操作系统的原生线程。在Linux上为pthread,在Windows上为Win thread,完全由操作系统调度线程的执行。一个python解释器进程内有一条主线程,以及多条用户程序的执行线程。即使在多核CPU平台上,由于GIL的存在,所以禁止多线程的并行执行。关于这个问题的折衷解决方法,我们在以后线程和进程章节里再进行详细探讨。

  (4).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的字节码。

.选择Py2.x还是Py3.x?

  目前大部分的python的程序都基于py2.7+以上写的,但是要学python的话建议从py3.x开始,并且了解py2.x与py.3.x的区别。并推动py2.x向py3.x的使用!

四.Python安装

  1):windows安装

    1、下载安装包

      https://www.python.org/downloads/
    2、安装
      默认安装路径:C:\python27
    3、配置环境变量
      【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 -->     【Python安装目录追加到变值值中,用 ; 分割】
    如:原来的值;C:\python27,切记前面有分号

  2):Linux/Mac安装

    无需安装,原装Python环境

    ps:如果自带2.7,请更新至3.x

 

 五.Hello World程序

  print ('Hello world!')
  其他语言版本的hello world,请百度自行查询。
  

六.变量 字符编码

    (1).变量定义的规则:

      • 变量名只能是 字母、数字或下划线的任意组合
      • 变量名的第一个字符不能是数字
      • 以下关键字不能声明为变量名
        ['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']

    (2).变量的赋值

       name1='jame'
       name2='tom'
       print (name1,name2)
       name2=name1
       name1='Jack' #修改name1的值,输入的name1/name2,其中name2的值不会变。   

    (3).编码

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

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

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

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

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

    报错:ascii码无法表示中文

1
2
3
#!/usr/bin/env python
  
print "你好,世界"

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

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

    注意:python3.x默认为utf-8格式,不需要单独为每个.py文件手动添加。

  (4).注释/及其注释的格式

    1):注释类型

      " 注释"

      '''注释'''/""" 注释 """

    2):print ("注释、用户输入、格式化输出

      name=input('name:')

      age = int(input("Age:"))

       job = input("Job:")

       saraly = input("Saraly:")

     info='''

    -----------------info of %s ------------------
    Name:%s
    Age:%d
    Job:%s
    Saraly:%s
    ''' % (name,name,age,job,saraly)     print (info)

    



    print ('以后采用这种模式打印格式!!!!:')
    info1='''
    ---------------info1 of {_name}----------------
    Name:{_name}
    Age:{_age}
    Job:{_job}
    Saraly:{_saraly}
    '''.format(_name=name,_age=age,_job=job,_saraly=saraly)
    print (info1)     
info2='''
  
    -------------info2 of {0}-----------------
    Name:{0}
    Age:{1}
    Job:{2}
    Saraly:{3}
    '''.format(name,age,job,saraly)     print (info2)
 

七.用户输入

   

5
6
7
#!/usr/bin/env python
#_*_coding:utf-8_*_
 
 
#name = raw_input("What is your name?") #only on python 2.x
name = input("What is your name?")
print("Hello " + name )

    输入密码时,如果想要不可见,需要利用getpass 模块中的 getpass方法,即:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python
# -*- coding: utf-8 -*-
  
import getpass
  
# 将用户输入的内容赋值给 name 变量
pwd = getpass.getpass("请输入密码:")
  
# 打印输入的内容
print(pwd)

表达式if else语句

  (1).if-else

    例如:if name == "alex" and pwd == "cmd":

        print("欢迎,alex!")
       else:
        print("用户名和密码错误")

  (2).if-elif-elif-else

    例如:

      if user_input == my_age:

        print("Congratulations, you got it !")
      elif user_input < my_age:
        print("Oops,think bigger!")
      else:  #也可以不用else,全部用elif保证条件的准确性,防止不可确定的因素。
        print("think smaller!")

  *外层变量,可以被内层代码使用

  *内层变量,不应被外层代码使用

九.表达式for 循环

  最简单的循环10次:

  for in range(10):

    print("loop:", i )
 
  

十.break and continue 

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

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

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

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

 

十一.表达式while 循环

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

  海枯石烂代码

1
2
3
4
5
count = 0
flag=True
while True:
    print("你是风儿我是沙,缠缠绵绵到天涯...",count)
    count +=1
      if conut>3:
      flag=False
else:  #while也可以用else,来表示条件不符合走这个分支!!
  print('输入次数过大,请稍后再试!')
  break
 
 
 

十二.作业

  Python基础-week01

   1.编写登陆接口

    

 #Author:Jame Mei
'''第一周的作业:输入用户名密码,认证成功后提示登陆成功,输入三次错误后锁定用户。''' count = 0 #记录用户输入密码的次数
flag = 1 #标志位
lock = []
user_pass = []
username = input('please input your name:') #读取黑名单的内容
f = open('black_mingdan','r')
lock_file = f.readlines()
f.close()
#将黑名单文件内容作为列表元素追加到列表中
for i in lock_file:
line = i.strip('\n')
lock.append(line) #若输入的用户名在黑名单中,如果在则给出提示信息:用户已经被锁定,请联系管理员。
if username in lock:
print('User %s Have Been Locked.It is not allow to login,please contact Administrator.' %username) else:
while True:
count += 1
passwd = input("please input your password:")
f = open('user_information', 'r')
user_file = f.readlines()
f.close() for i in user_file:
user_pass = i.strip().split(',')
# 判断输入的用户名==user_pass[0] and 密码==user_pass[1],如果相等,则提示欢迎信息并退出循环,如果不相等则
# 结束本次循环
if username == user_pass[0] and passwd == user_pass[1]:
print('welcome user %s login !' % username)
flag = True
break
else:
continue # 若flag为真,则用户名和密码输入正确跳出整个循环体,反之,若用户输入密码错误的次数为3,则给出提示信息:用户已经被锁定
# 并将username追加到黑名单中
if flag is True:
break
else:
if count == 3:
print('User Have Been try 3 times,Have Been Locked')
lock_file = open('black_mingdan', 'a')
# lock_file.write('Have Been Locked User:%s\n' %username)
lock_file.write('%s\n' % username)
lock_file.close()
break

  #优化版:

 Author Meijinmeng
'''
2.升级需求:login2.py
可以支持多个用户登录 (提示,通过列表存多个账户信息)
用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(提示:需把用户锁定的状态存到文件里)
'''
account_pwd={
'jame':{'pwd':'','count':0},
'alice':{'pwd':'','count':0},
'tomcat':{'pwd':'','count':0}
}
while True:
account=input("Please your account:").strip()
with open('blackdb.txt', 'r') as f:
for line in f: #lock_users = f.read().split('|') 用文件查找替换的思路,如果有大量黑名单下面效率可能会高
if account == line.strip():
print('%s already locked,Please contact the administrator!' % account)
exit(0) if account in account_pwd:
if account_pwd[account]['count'] > 2:
print('Too many input times,locking!')
with open('blackdb.txt', 'a+') as f:
f.write('%s\n' %account) #f.write('%s|' %account) 用换行的方式每行只写1个有点浪费呀
break password = input("Please your passord>>>:")
if password == account_pwd[account]['pwd']:
print("Welcome {_username},login success!".format(_username=account))
break
else:
print ('Your password error,Please try agin!')
account_pwd[account]['count']+=1
continue
else:
print ("Your input account never existed ,please try agin!")
continue

   2.多级菜单并检测输入次数过多

 #Author:Jame Mei
university_list = {
"安徽省": {
"合肥": ["中国科技大学", "合肥工业大学"],
"蚌埠":["安徽财经大学","蚌埠医学院"],
"安庆": ["安庆学院"],
"阜阳": ["阜阳学院"]
},
"江苏省": {
"南京": ["南京大学", "南京工业大学"],
"南通": ["南通大学"],
"苏州": ["苏州大学"],
},
"浙江省": {
"杭州": ["浙江大学", "杭州电子科技大学"],
"宁波": ["宁波大学"],
"嘉兴": ["嘉兴学院"],
}
} flag = True # 标记
try_province = 0 # 次数设置
try_city = 0
try_school = 0 while flag: # while循环语句,即在某种条件下执行某段程序
if try_province <3:
province_str1 = "欢迎进入沿海省份"
print(province_str1.center(20, '-')) # 打印好看一点,处于中心位置 for province in university_list.keys(): # for in循环遍历,key函数用于判断province是否存在于字典中,如在字典里返回true,否则返回false。
print(province)
print("----------------------------")
province_input = input("请输入省份:")
city_flag = True while city_flag:
if try_city<3:
if province_input.strip() in university_list:
print("欢迎进入: %s!" % (province_input,)) # 赋值,记得一定要有个逗号
province_str2 = "欢迎进入沿海地区"
print(province_str2.center(20, '-'))
for city in university_list[province_input].keys():
print(city)
print("----------------------------")
city_input = input("请输入城市名称:") school_flag = True
while school_flag:
if try_school < 3: if city_input.strip() in university_list[province_input]:
print("欢迎进入:%s!" % (city_input,))
province_str3 = "欢迎进入沿海大学"
print(province_str3.center(20, '-'))
for school in university_list[province_input][city_input]:
print(school)
print("----------------------------")
school_input = input("请输入大学名称:") if school_input.strip() in university_list[province_input][city_input]:
print("欢迎进入:%s!" % (school_input,))
print("当前位置:%s--%s--%s " % (province_input, city_input, school_input))
print("哈哈哈,已经结束啦啦啦")
flag = False
city_flag = False
school_flag = False
break
else:
print("您输入的信息有误,请重新输入!")
try_school += 1 else:
print("你输入的城市信息有误,请重新输入!")
try_city += 1
school_flag = False else:
print("您输入的次数超过三次了哟,退出!")
flag = False
city_flag = False # 这边注意遗漏
school_flag = False # 这边注意遗漏 else:
print("你输入的信息有误,请重新输入")
try_province += 1
city_flag = False else:
print("输入超过又三次了哟!,退出!")
flag = False
city_flag = False else:
print("输入超过三次,退出!")
flag = False