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('\n').split('')
    name_list.append(name)
    name_dict[name] = password
pass_list.close()
#将黑名单的信息读取,存储到列表中
for i in black_list:
    clock_list.append(i.strip('\n'))
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 + '\n')
                f.close()
                sys.exit()
    else:
        print ("用户未注册")
        sys.exit()
View Code

 

posted @ 2018-02-23 17:26  小律爷  阅读(307)  评论(0编辑  收藏  举报