Python基础---1

知识点

语言的分类

①编译型语言和解释性语言

 编译型语言是指在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候,就不用再进行翻译了。解释型语言是指是在运行的时候将程序翻译成机器语言,所以运行速度相对于编译型语言要慢。C/C++ 等都是编译型语言,而Java,C#等都是解释型语言。虽然Java程序在运行之前也有一个编译过程,但是并不是将程序编译成机器语言,而是将它编译成字节码(可以理解为一个中间语言)。在运行的时候,由JVM将字节码再翻译成机器语言。

②动态语言和静态语言

动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型。如python和ruby等。静态类型语言:它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型。如C/C++,java,C#等。

③强类型定义语言和弱类型定义语言

强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了,如python。
弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。如VScript。

python的优点

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

python的缺点

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

python的解析器

①cpyton

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的字节码。

在编写Python程序时,/usr/bin/python和/usr/bin/env python的区别?

#!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器;
#!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。
#!/usr/bin/python相当于写死了python路径;
#!/usr/bin/env python会去环境设置寻找python目录,推荐这种写法

变量和字符编码

name = “alex Li”

变量的命名规则

①变量名只能是 字母、数字或下划线的任意组合
②变量名的第一个字符不能是数字
③以下关键字不能声明为变量名
['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']
④变量名要见名之义。
跑车哥牛朋友的名字:glOfOldBoy gf_of_oldboy

常量

不能改变的量,变量名要大写。(可以修改,但是不应该改)。

字符编码

二进制:通过01排列表示复杂的数字,例如7=111,4=010
字符编码的区别与联系
①ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,最多只能有八位字节来表示,ASCII码最多只能表示 255 个符号。,占八位,一个字节。
②unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,
它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,备注:是至少需要2个字节。
③UTF-8,是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类:ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存。

Python3默认的字符编码就是utf-8

注释:

①单行注释 #

②多行注释 ‘’'注释内容''' “”“注释内容”“”

打印多行就要用到多行,
shell中,$符号单引号不会被转义,双引号会对转义。
在python中单引号和双引号是没有区别的。

标准化输出:

①第一种标准输出:

②第二种标准输出(使用占位符)

复制代码
#!/usr/bin/env python
# _*_ coding:utf8 _*_
#author:snate
name=input("name:")
age=int (input("age:"))
Job=input("Job:")
salary=float (input("salary:"))
info="""
    -----------info of %s-----------
    name:%s
    age:%d
    Job:%s
    salary:%f
    -------------------------------
""" %(name,name,age,Job,salary)
print(info)
复制代码

其中%s是占位符,""" 标准输出内容""",此处单引号双引号都可以。
input默认输入的是字符串,要转化成数字类型需要强转。
#在python2.#中raw_input和python3.#的input的作用完全相同。
#在python2.#中input输入的是什么类型就是什么类型。

③第三种标准输出

复制代码
#!/usr/bin/env python
# _*_ coding:utf8 _*_
#author GXW
name=input("name:")
age=int(input("age:"))
job=input("Job:")
salary = float(input("salary:"))
info2='''
    =================info of {_name}====================
    name:{_name}
    age:{_age}
    job:{_job}
    salary:{_salary}
    ===================================================
'''.format(_name=name,
               _age=age,
               _job=job,
               _salary=salary)
print(info2)
复制代码

使用format进行标准输出,利用key的形式。'.format(_name=name,_age=age,_job=job,_salary=salary)
备注:掌握第二种和第三种标准输出格式。

初识模块

在输入密码时,为了使密码不可见,可以条用getpass模块的getpass()方法。
password = getpass.getpass("请输入您的您的密码:");
代码如下:


执行结果如下:

①sys

结果返回的是一个列表,其中argv[0]是程序名,argv[1]是紧跟的第一个参数,agrv[2】是第二个参数。

②os

os.system("pwd"),保存的是程序的执行结果的状态(0或者是1,0表示执行成功,1表示失败)但是并不记录程序的输出结果。

os.poopen("pwd").read()是保存linux命令的执行结果,但是末尾有个\n,通过字符串的strip()方法,将\n过滤掉。

③commands(python2中有一个模块,在python3中没有这种模块)

在ubuntu14.04中中验证如下:

以元组的形式保存,保存结果为(status,result)。

流程控制(if else)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
# _*_ coding:utf8 _*_
#author:snate
cnt = 0 ;
alex_age = 50
while  cnt< 3 :
    guess_age  = int ( input ( "请输入您猜测的年龄:" ))
    if  alex_age = = guess_age:
       print ( "You are lucky,you got it" );
       break
    elif  alex_age>guess_age:
       print ( "Think bigger" );
    else :
       print ( "think smaller" );
    cnt  + =  1
else :
    print ( "Your input number is too much,fuck off!" )

还有break,continue的用法,其中break是结束循环,continue是结束本次循环。无限循环,使用 while true:使用break可以跳出循环。

复制代码
 #!/usr/bin/env python
# _*_ coding:utf8 _*_
#author:snate
cnt=0;
alex_age=50
while cnt<3:
   guess_age =int(input("请输入您猜测的年龄:"))
   if alex_age==guess_age:
      print("You are lucky,you got it");
      break
   elif alex_age>guess_age:
      print("Think bigger");
   else:
      print("think smaller");
   cnt += 1
   if cnt==3:
      continue_flag = input("do you want continue?(yes or no)")
      if continue_flag !="n":
         cnt=0
      else:
         print("提出系统!\n")
         break
复制代码

当用户的次数超过三次时,提示是否还要继续?输入为N,或者为n就退出系统,否则继续。

for 循环:

复制代码
#!/usr/bin/env python
# _*_ coding:utf8 _*_
#author:snate
for i in range(0,10,3):
   print("loop",i)
   if i>=6:
      break
复制代码

range(0,10,3)表示从0.10 步符是3.

数据类型的分类

运算符

①算数运算

②逻辑运算

③比较运算

④赋值运算

⑤成员运算

⑥位运算

作业1:

用户登录接口

复制代码
#!/usr/bin/env python
# _*_ coding:utf8 _*_
#author:snate
import sys

user_lock_file="user_lock.txt"  # 用户所锁文件
user_file="user.txt"  # 用户文件
retry_limit = 3  # 输入的限制次数,若超过此次数,就将用户锁定
retry_count = 0   # 用户输入次数的计数器

while retry_limit >retry_count:
    user_name=input("\033[31m请输入用户名:\033[0m")
    # 开始检测输入的用户名是否被锁
    lock_check = open(user_lock_file)  # 当输入用户名之后,打开锁文件判断用户是否以被锁。
    #print("nihao")
    for line in lock_check.readlines():  # 循环锁文件,判断用户是否被锁
        #print("nihao")
        if user_name in line:
            sys.exit("\033[31m %s is locked!\033[0m" %user_name)
    user_password=input("\033[31m请输入密码:\033[0m")
    # 当用户不在锁文件中,输入密码,开始检测用户名和密码
    flag = False  # 用来记录是否用户名和密码是否匹配成功
    user_check = open(user_file,"rb")
    for line in user_check.readlines():
        # print (type(line))
        user, password = str(line).strip("b'").strip("\\r\\n'").split(" ");  # 问题出在这里,晚上回去问助教
        # print(user,password)
        if user_name == user and user_password == password:
            flag = True
            break
        else:
            flag = False
    user_check.close()
    if flag:
        print("Welcome to Oldboy IT System!I wait you too long!")
        break
    else:
        print("User not matched!")
        retry_count += 1
else:
    print("您输入用的次数已到,用户已被锁!")
    add_lock=open(user_lock_file,"w")
    add_lock.write(user_name)  # 当用户的输入次数大于规定的次数后,用户被添加到锁文件中
    add_lock.close()
复制代码

流程图:

Readme:

复制代码
用户登录接口程序 
 作者介绍: 
  name:angle
 nickName:snate 
 blogaddreess:http://192.168.1.1/csdn.log/ 
 
 功能介绍: 
  根据输入的用户名,首先判断用户是否在锁文件中。 
 不在锁文件中,输入用户的密码,判断密码是否匹配,若匹配,进入系统登录成功界面; 若不匹配次数超过限定的输入次数,就将用户写入到锁文件中。 
 
 环境依赖: 
  python3.* 
 ngetpass 
 sys 
 
 目录结构: 
 User_login
├── __init__.py
├── README.md
├── user_lock.txt#锁用户文件
├── user.txt #用户文件
├── test_user_login.py#用户登录测试程序
 
 运行说明: 
  将程序拷贝到安装好python3.*的环境中,执行python test_user_login运行即可。 
 
 
复制代码

三级菜单:

复制代码
#!/usr/bin/env python
# _*_ coding:utf8 _*_
#author:GXW
import sys
# 用户打印一级菜单
def menu():
    print("----------------------一级菜单-------------------")
    for index, key in enumerate(province_dic.keys(), 1):
        print(index, key)
        dic_key[str(index)] = key
    choose1 = input("请选择一级菜单!输入q时,退出系统,输出b时,返回上一级目录")
    if choose1 == 'q':
        quit()
    elif choose1 == 'b':
        print("目录为一级目录,不能跳转,请重新选择")
        return
    elif dic_key.get(choose1, 0):
        menu2(dic_key[choose1])
    else:
        print("您的输入有误,请重新输入")

# 用户打印二级菜单
def menu2(choose1):
    print("----------------------二级菜单---------------------------")
    for index, key in enumerate(province_dic[choose1].keys(), 1):
        print(index,key)
        dic_key[str(index)] = key
    choose2 = input("请选择二级菜单!输入q时,退出系统,输出b时,返回上一级目录")
    if choose2 == 'q':
        quit()
    elif choose2 == 'b':
        menu()
    elif dic_key.get(choose2, 0):
        menu3(choose1, dic_key[choose2])
    else:
        print("您输入有误,请重新输入")
def menu3(choose1, choose2):
    print("-----------三级菜单---------------------------------------")
    for index, key in enumerate(province_dic[choose1][choose2], 1):
        print(index,key)
        dic_key[str(index)] = key
    choose3 = input("请选择三级菜单!输入q,退出系统,输入b,返回b时,返回上一级目录")
    if choose3 == 'q':
        print("")
        quit()
    elif choose3 == 'b':
            menu2(choose1)
    else:
        print("您输入有误,请重新输入")

province_dic = {
    "山东省":{
        "滨州市":{"惠民县","沾化县","无棣县","邹平县","阳信县"},
        "济南市":{"济阳县","商河县","平阴县","历下区","天桥区"},
        "菏泽市":{"定陶县","单县","巨野县","东明县","开发区"},
        "德州市":{"德城区","夏新县","平原县","陵县","乐陵县"}
    },
    "北京市":{
        "海淀区":{"航天科工","航天科技"},
        "朝阳区":{"巨人教育","老男孩教育"},
        "丰台区":{"下埔","岳各庄"}
    },
    "湖北省":{
        "武汉市":{"武昌区","江汉区","洪山区"},
        "荆州市":{"青山区","硚口区","江夏区"},
        "襄樊市":{"新洲区","南山区","北山区"}
    }
}
if __name__ == '__main__':
    dic_key = {}
    menu()
复制代码

流程图:

Readme:

复制代码
这是一个全国的三级菜单(省/直辖市、市、县/区)程序
个人介绍
name:angle
nickName:snate
blog_addr:http://192.168.0.2/csdn.blog
功能介绍
根据三级列表,查询各个省有哪些城市。例如:北京市:分为:海淀区、丰台区、 朝阳区、石景山区等。
环境依赖
python3.*
window/linux os
目录结构:
three_level_menu
├── __init__.py
├── README.md
├── provice_city_county.py#用户登录测试程序
      ├── menu#打印一级菜单
      ├── menu2#打印二级菜单
      ├── menu3#打印一级菜单
运行说明
将文件拷贝到安装好python3.*的系统环境中,执行python provicecitycounty.py即可。