zoukankan      html  css  js  c++  java
  • Week1-python笔记

     Week 1

    1 python的介绍

    python的创始人为吉多·范罗苏姆(Guido van Rossum)。

    python不仅是一门脚本语言。

    1.1 语言的分类

    1.1.1 编译语言VS解释语言

    (1)编译(Compile):源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序。

    复杂的程序将代码分散在各个源文件中,作为不同的模块来组织。编译各个文件时就会生成目标文件(Object  file)。一般一个源文件的编译都会对应一个目标文件。这些目标文件基本上已经是可执行代码,但由于只是整个项目的一部分,所以还不能直接运行。待所有的源文件的编译完成,由链接程序(Linker)将目标文件“打包”成一个可执行文件。

    (2)解释:只在执行程序时,才源代码解释成机器语言给计算机来执行。

    可移植性:程序不用改动就可以在移植了解释器的系统上运行。

    打个比方:假如你打算阅读一本外文书,而你不知道这门外语,那么你可以找一名翻译,给他足够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读;或者,你也立刻让这名翻译辅助你阅读,让他一句一句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。 

    解释语言是说解释执行的语言,但执行的代码并不一定是文本格式的。脚本语言的程序是文本文件,并且是解释执行的。

    1.1.2 动态语言VS静态语言

    (1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言。在用动态类型的语言编程时,不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言。

    (2)静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型。C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

    1.1.3 强类型定义语言VS弱类型定义语言

    (1)强类型定义语言:强制数据类型定义的语言。一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。

    (2)弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反,一个变量可以赋不同数据类型的值。

    结论:python是一门动态解释性的强类型定义语言。

    1.2 .pyc是什么鬼

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

    用Java来举例,在执行之前已经预先进行一次预编译,生成的代码是介于机器码和Java源代码之间的中介代码,运行的时候则由JVM(Java的虚拟机平台,可视为解释器)解释执行。所以我们说Java是一种先编译后解释的语言。

    Python也是一门先编译后解释的语言。

    1.2.1 python的运行过程

    PyCodeObject则是Python编译器真正编译成的结果。pyc文件其实是PyCodeObject的一种持久化保存方式。

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

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

    1. 首先需要知道,只有在import导入py文件时,才会产生pyc字节码文件,该字节码文件是可以代替源文件而直接执行的

    2. 但每次执行py文件,产生的字节码并不会保留下来,也就是说,每次执行py文件,都是要重新经历一遍:py文件->字节码->python解释器->机器码,每次都是一个重新解释执行的过程。

    1.3 python解释器

     运行代码需要Python解释器去执行包含Python代码的以.py为扩展名的文本文件。

    Cpython(最常用)
        Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。
    PyPy(特殊)
    *PyPy*和CPython很像的实现,解释器本身就是由Python写成。CPython会把代码转化成字节码,PyPy会把代码转化成机器码。
    Jyhton 
    Python的Java实现,Jython使用了JIT技术,将Python代码动态编译成Java字节码(不是java源代码),然后在JVM上运行。
    IronPython
        Python的C#实现,IronPython将Python代码编译成C#字节码,然后在CLR上运行。(与Jython类似,可以使用在.NET 和 Mono平台的解释器)

    1.4 python安装

     1.4.1 windows

     多版本共存:

    1、下载安装包
        https://www.python.org/downloads/ 下载windows版本的python2和python3
    2、安装
        默认安装路径:C:python
        安装完python2后,打开安装路径,把python.exe执行文件改名为python2.exe
    3、配置环境变量
        添加环境变量:此电脑--属性--高级系统设置--高级--环境变量--系统变量--Path--编辑(Python安装目录)
    4、是否安装成功
        打开终端,在终端中输入分别python2和python测试是否成功
    

    1.4.2 linux

    1、linux自带python
       查看版本:python -V
    2、linux下Python版本更新至最新
       安装gcc,用于编译python源码:yum install gcc
       下载并解压源码包:https://www.python.org/ftp/python/
    cd /opt
    wget --no-check-certificate https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tar.xz
    tar xf Python-2.7.9.tar.xz 
    cd Python-2.7.9
       编译安装python2.7.9
    ./configure
    make all
    make install
    /usr/bin/python2.7 -V   
       修改默认python版本
    mv /usr/bin/python /usr/bin/python2.6
    ln -s /usr/local/bin/python2.7 /usr/bin/python
    python -V

     指定解释器

    将头文件#!/usr/bin/python 改为#!/usr/bin/python2.6 或 #!/usr/bin/env python

    2 字节编码

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

    ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 = 256-1

    而后设计了用于简体中文的GB2312(1980年)一共收录了7445个字符,GB2312 支持的汉字太少,1995年的汉字扩展规范GBK1.0收录了21886个符号。2000年的 GB18030是取代GBK1.0的正式国家标准,该标准收录了27484个汉字。

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

    Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。

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

    使用python输出中文需要声明:# -*- coding: utf-8 -*-

    3 第一个python程序

    3.1 方式一:交互式编程

    交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码。

    linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,如下:

    $ python
    Python 2.7.6 (default, Sep  9 2014, 15:04:36) 
    [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 

    Window上在安装Python时已经已经安装了默认的交互式编程客户端,在命令行执行python后,输入以下文本信息,然后按 Enter 键查看运行效果:

    >>>  print ("Hello, Python!")

    3.2 方式二:脚本式编程

    把python代码保存在后缀名为.py的文件中,通过脚本参数调用解释器开始执行执行.py文件。

    eg.在该文件目录下执行命令python hello.py,可以看到同样会输出Hello,Python!

    或者回到文件所在的文件夹中,按住Shift+鼠标右键,选择在此处打开命令窗口,执行命令python hello.py。

    3.3 方式三:指定解释器

    另一种方式来执行Python脚本。修改test.py文件,如下所示:

    #!/usr/bin/python
    
    print "Hello, Python!";

    假定您的Python解释器在/usr/bin目录中,使用以下命令执行脚本:

    $ chmod +x test.py     # 脚本文件添加可执行权限
    $./test.py

    输出结果:

    Hello, Python!

    这里可以使用PyCharm。PyCharm是一种Python IDE。

    4 变量与内存管理

    4.1 什么是变量?为何要有变量?

    答:程序当中,变量是计量某种状态的。变量是反映变化的过程,在变化的过程中记录某种状态。

    name = "zhouxy"

    上述代码声明了一个变量,变量名为(标识符): name,“=”  :赋值符号,变量name的值为:"zhouxy"。

    4.2 标识符命名规范

    • 变量名不能太长且要有意义,不能是中文或拼音。
    • 变量名只能是字母、数字、下划线的任意组合。
    • 变量名的首字符不能是数字
    • 关键字不能声明为变量名:

    [‘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‘]

    4.3 定义变量的方式

    驼峰体和下划线方式。建议使用下划线方式。

    4.4 变量的赋值与修改

    name = "zhouxy"
    name2 = name
    print(name,name2)
    name = "xyzhou"
    print("What is the value of name2 now?")

    4.5 注释

     当行注视:# 被注释内容

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

    5 输入输出

    5.1 输入

    在python3中的输入的命令是input,在python2中的输入命令是raw_input。

    5.2 输出

    5.2.1 print

    在python3中,print必须加上括号。python2中则可以不加括号。

    5.2.2 getpass:非明文方式显示(在Pycharm下无效) 

    需要导入getpass模块

    # 非明文方式显示
    import getpass
    username = input("用户名:")
    password = getpass.getpass("密码:")
    print(username)
    print(password)

    5.2.3 占位符:%s

    username = input("username:")
    password = int(input("password:")) # int()强制转换输入类型,默认为字符串
    print("用户名:%s"%(username))   # 占位符 :%d(数字)%f (浮点)
    print("密码:%d"%(password))

    name = input("Please enter your username : ")
    # type()可以接收任何东西作为参数――并返回它的数据类型。整型、字符串、列表、字典、元组、函数、类、模块,甚至类型对象都可以作为参数被type函数接受。
    print(type(name))
    age = int(input("Please enter your age : "))
    print(type(age))

    当我们需要使用int类型的值时需要 用int()这个方法将str强制转换成int类型。

    当然也是可以str()转换成str类型的,float()转换成float(浮点型),hex()可以将值转换成16进制,long()把字符串和数子转换成长整数

    list()函数可将序列对象转换成列表,oct()函数可把给出的整数转换成八进制数,ord()函数返回一个字符串参数的ASCII码或Unicode值、格式

    username = input("username:")
    password = int(input("password:"))
    info = '''
    用户名:%s
    密码:%d
    '''%(username,password)
    print(info)

    5.2.4 .format

    username = input("username:")
    password = int(input("password:"))
    info = '''
    用户名:{name}
    密码:{pwd}
    '''.format(name=username,pwd=password)
    print(info)

    username = input("username:")
    password = int(input("password:"))
    info = '''
    用户名:{0}
    密码:{1}
    重复密码:{1}
    '''.format(username,password)
    print(info)

    6 模块简介

    python模块包括标准模块和第三方模块(安装模块)。

    6.1 sys

    import sys
    print(sys.path) #打印环境变量
    print(sys.argv) #打印相对路径,在PyCharm中打印绝对路径

    可以输入脚本所需参数,如下图所示:

    可以取传入参数值,如下图所示:

    print(sys.argv[2])

    6.2 os

    import os
    os.system("dir") # 查看所在文件目录
    
    cmd_res1 = os.system("dir") # 只执行命令,不保存结果
    cmd_res2 = os.popen("dir") # 打印内存地址
    cmd_res3 = os.popen("dir").read()
    print(cmd_res1,cmd_res2,cmd_res3)
    
    os.mkdir("new") # 新建一个文件

    自己写的模块只能在当前目录下导入,如果要在全系统都使用,就要把模块放到python全局环境变量目录里,一般都放在site-packagees目录下,也可以修改环境变量路径。 

    7 数据类型 

    7.1 数字

    int(整型)

      在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1。
      在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1。

    long(长整型)
      跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。
      Python2如果整数发生溢出,会自动将整数数据转换为长整数,Python3如果整数发生溢出,数据类型仍为整型。 

    float(浮点型)

           3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4。

    complex(复数) 

    7.2 布尔值

           真或假
      1 或 0

    7.3 字符串

          "hello world"

          字符串拼接:>>> name + age #相加其实就是简单拼接

     注意,字符串的拼接只能是双方都是字符串,不能跟数字或其它类型拼接

    7.4 列表

    name_list = ['zhouxy', 'seven', 'female']
    或
    name_list = list(['zhouxy', 'seven', 'famale'])

    7.5 元组

    person = {"name": "zhouxy", 'age': 18}
    或
    person = dict({"name": "zhouxy", 'age': 18})
    

    8 流程控制

    8.1 表达式if...else

    8.1.1 用户登录认证

    # 提示输入用户名和密码
    # 验证用户名和密码
    #     如果错误,则输出用户名或密码错误
    #     如果成功,则输出欢迎,XXX!
    
    _username = "zhouxy"
    _password = 123456
    username = input("用户名:")
    password = int(input("密码:"))
    if _username != username or _password != password:
        print("用户名或密码错误")
    else :
        print("欢迎,",username)

    8.1.2 猜年龄

    在程序里设定好你的年龄,然后启动程序让用户猜测,用户输入后,根据他的输入提示用户输入的是否正确,如果错误,提示是猜大了还是小了。

    age_of_me = '24'
    age = input("我的年龄?")
    if age_of_me == age :
        print("猜对了!")
    elif age_of_me > age :
        print("猜小了!")
    else :
        print("猜大了!")

    8.2 表达式whlile循环

    8.2.1 猜年龄V2.0

    实现让用户不断的猜年龄,但只给最多3次机会,再猜不对就退出程序,猜对也退出程序。

    age_of_me = 24
    count = 1
    while count < 4 :
        age = int(input("我的年龄?"))
        count += 1
        if age_of_me == age :
            print("猜对了!")
            break
        elif age_of_me > age :
            print("猜小了!")
        else :
            print("猜大了!")
    else :
        print("笨蛋!")

    8.3 表达式for循环

    for i in range(10):
        print("loop:", i )

    i:临时变量

    8.3.1 break

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

    8.3.2 continue

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

    可以debug来看代码运行,而对于break和continue的理解,break是打校长,就不用上课了,continue是打老师,只不过当天不用上课,后面还得上课!

    9 数据运算 

    9.1 算数运算

     

    9.2 比较运算

    9.3 赋值运算

    9.4 逻辑运算

     

    and注解:

    1. 在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值;而是,返回它们实际进行比较的值之一。
    2. 在布尔上下文中从左到右演算表达式的值,如果布尔上下文中的所有值都为真,那么 and 返回最后一个值。
    3. 如果布尔上下文中的某个值为假,则 and 返回第一个假值

    or注解:

    1. 使用 or 时,在布尔上下文中从左到右演算值,就像 and 一样。如果有一个值为真,or 立刻返回该值
    2. 如果所有的值都为假,or 返回最后一个假值
    3. 注意 or 在布尔上下文中会一直进行表达式演算直到找到第一个真值,然后就会忽略剩余的比较值

    and-or结合使用:

    1. 结合了前面的两种语法,推理即可。
    2. 为加强程序可读性,最好与括号连用,例如:
      (1 and 'x') or 'y'

    9.5 位运算

    9.6 成员运算

    9.7 身份运算

    9.8 运算符优先级:自上而下,优先级从高到低

     10 homework1

    1. 用户输入帐号密码进行登陆

    2. 用户信息保存在文件内

    3. 用户密码输入错误三次后锁定用户

    # Author:zhouxy
    import os
    import sys
    
    # 定义登录黑白名单列表
    pass_list = open("pass.txt","r") # 预先填写,格式为姓名:密码
    black_list = open ("black.txt","r")
    # 定义空列表
    name_list = []
    clock_list =[]
    name_dict = {}
    # 定义变量
    count = 0
    _count = 2
    #将白名单中的信息读取,存储到列表中
    for i in pass_list:
        name,password = i.strip('
    ').split('')
        name_list.append(name)
        name_dict[name] = password
    pass_list.close()
    #将黑名单的信息读取,存储到列表中
    for i in black_list:
        clock_list.append(i.strip('
    '))
    black_list.close()
    
    username = input("请输入用户名:")
    if not username:
        print("用户名不能为空")
    elif username in clock_list:
        print ("抱歉,用户名已被锁定QAQ")
        sys.exit()
    else:
        if username in name_dict:
            for count in range(10):
                if count < 3:
                    passwd = input("请输入用户密码:")
                    if not passwd:
                        print("用户密码不能为空")
                    elif passwd == name_dict[username]:
                        print ("欢迎".center(40,'-'))
                        break
                    else:
                        print ("密码错误,还剩下%s机会"%(_count))
                        count +=1
                        _count -=1
                        continue
                if count > 3:
                    print ("用户名已被锁定")
                    f = open('black.txt','a')
                    f.write(username + '
    ')
                    f.close()
                    sys.exit()
        else:
            print ("用户未注册")
            sys.exit()
    View Code
  • 相关阅读:
    NPM使用技巧
    重构老项目所悟
    Angular2开发笔记
    nodejs项目mysql使用sequelize支持存储emoji
    [原创]django+ldap+memcache实现单点登录+统一认证
    [原创]django+ldap实现单点登录(装饰器和缓存)
    [原创]django+ldap实现统一认证部分二(python-ldap实践)
    [原创]django+ldap实现统一认证部分一(django-auth-ldap实践)
    ldap部署相关,ldap双机LAM配置管理ldap备份还原
    通过pycharm使用git[图文详解]
  • 原文地址:https://www.cnblogs.com/cirr-zhou/p/8458971.html
Copyright © 2011-2022 走看看