2018-2019-2 20189206 Python3学习

python3简明教程学习


基本概念

脚本文件:

脚本文件英文为Script。实际上脚本就是程序,一般都是由应用程序提供的编程语言。应用程序包括浏览器(javaScript、VBScript)、多媒体创作工具,应用程序的宏和创作系统的批处理语言也可以归入脚本之类。
脚本文件类似于DOS操作系统中的批处理文件,它可以将不同的命令组合起来,并按确定的顺序自动连续地执行。脚本文件是文本文件,用户可使用任一文本编辑器来创建脚本文件。

解释器:

解释器(英语:Interpreter),又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行。解释器不会一次把整个程序转译出来,只像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。


解释器

python是一个脚本语言,可以在python解释器中直接写代码或者将代码写到一个文件(脚本文件)然后执行这个文件。

可以用两种方式使用python语言:

  • 在shell中输入python即可进入交互界面,交互界面中即可运行。

  • 在vim编辑器中,创建一个.py的文件,并输入代码如下图所示

- 代码中的前两个字符`#!`称为shebang告诉shell使用python解释器执行下面的代码,同时需要为脚本文件添加可执行权限,最后执行文件即可。

模块

模块包含了可以复用的代码文件,包含了不同的函数定义,变量。模块文件通常以.py为扩展名,使用之前先需要导入它。


python基本的数据类型和变量

python的关键字必须完全按照下面来拼写

python不需要为变量指定数据类型,可以直接写出abc = 1同时python的字符串用单引号或双引号括起来即可。

从键盘读取输入

input()函数可以实现从键盘读取输入。

实现了从键盘读取一个数字并且检查这个数字是否小于100,运行结果如下图所示

计算投资:

在看代码时不太能看懂输出语句的格式,对比执行后的结果

 print("Year {} Rs. {:.2f}".format(year, value))

Year 1 Rs. 11400.00

可以看到,大括号和其中的字符会被替换成传入.format()中的变量的值,其中{:.2f}表示替换为2位精度的浮点数。

看不懂的地方涉及到函数str.format()是一个强大的格式化函数

通过位置

In [1]: '{0},{1}'.format('kzc',18)
Out[1]: 'kzc,18'
In [2]: '{},{}'.format('kzc',18)
Out[2]: 'kzc,18'
In [3]: '{1},{0},{1}'.format('kzc',18)
Out[3]: '18,kzc,18'

通过关键字参数:即大括号中包含对应的参数名

通过对象属性

class Person:
  def __init__(self,name,age):
    self.name,self.age = name,age
    def __str__(self):
  return 'This guy is {self.name},is {self.age} old'.format(self=self)

In [2]: str(Person('kzc',18))
Out[2]: 'This guy is kzc,is 18 old'

括号中的参数{:5d} {:7.2f}分别表示,替换为5个字节宽度的整数;替换为7个字节宽度并显示小数点后两位的浮点数。

单行定义多个变量或赋值

元组(truple)利用逗号创建元组,例如a , b = b, a在赋值语句的右边我们创建了一个元组,称为元组封装;赋值语句左边则是元组拆封。

>>> data = ("shiyanlou", "China", "Python")
>>> name, country, language = data

也就是说,data,(name, country, language)
是两个封装,而第二条语句对data进行了拆封。

运算符和表达式

运算符

  • 数学操作符 + - /只要有一个操作符是浮点数,结果就会是浮点数。使用//将会返回商的整数部分。%求余运算符

计算月份和天数

divmod()函数

python divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。

  • 关系运算符与其他高级语言一致
  • 逻辑运算符 and or not

逻辑运算符的优先级又低于关系运算符,在它们之中,not 具有最高的优先级,or 优先级最低,所以 A and not B or C 等于 (A and (notB)) or C

2 > 1 and not 3 > 5 or 4 这条语句可以看作是((2 > 1) and (not (3 > 5))) or 4 其中 2 > 1 为真 (not (3 > 5))也为真,故返回 True

程序理解

#!/usr/bin/env python3
sum = 0
for i in range(1, 11):
    sum += 1.0 / i
    print("{:2d} {:6.4f}".format(i , sum))

所涉及函数

python range()函数用法

range(start, stop[, step])

参数说明:

start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

所以在上面代码中的for循环,即i从1开始,到10结束,其中不包含11;每循环一次进行一次运算,同时打印i和sum的值。

#!/usr/bin/env python3
import math
a = int(input("Enter value of a: "))
b = int(input("Enter value of b: "))
c = int(input("Enter value of c: "))
d = b * b - 4 * a * c
if d < 0:
	print("ROOTS are imaginary")
else:
	root1 = (-b + math.sqrt(d)) / (2 * a)
	root2 = (-b - math.sqrt(d)) / (2 * a)
	print("Root 1 = ", root1)
	print("Root 2 = ", root2)

以上是一个求解二次方程的代码。

#!/usr/bin/env python3
basic_salary = 1500
bonus_rate = 200
commission_rate = 0.02
numberofcamera = int(input("Enter the number of inputs sold: "))
price = float(input("Enter the price of camera: "))
bonus = (bonus_rate * numberofcamera)
commission = (commission_rate * price * numberofcamera)
print("Bonus= {:6.2f}".format(bonus))
print("Commission   = {:6.2f}".format(commission))
print("Gross salary = {:6.2f}".format(basic_salary + bonus + commission))

运行结果如下:

math模块调用的方法

  • math.pi是一个模块变量不能当作函数调用使用
  • math.sqrt() 是求平方根

if-else

语法格式:
if expression:
do this
else:
do this


if expression:
do this
elif experssion:
do this
else:
do this

注意if后面表达式的:不能少

if后面的表达式为真将执行缩进的所有行,要保证缩进的正确

while循环

语法格式
while condition:
statement1
statement2

要执行的语句必须以正确的缩进放在while语句下面,在表达式condition为真时执行

斐波那契数列实现

#!/usr/bin/env python3
a, b = 0, 1
while b < 100:
	print(b, end=' ')
	a, b = b, a + b
print()

对于语句a, b = b, a + b可以理解为Python会先对复制右边的表达式求值然后将值赋给左边的变量。即将b的值赋给a,a+b的值赋给b。

print()函数除了打印默认字符外,还会打印一个换行符,所以每次调用print()就会换一次行,利用end参数来替换换行符,如上代码中print(b, end=' ')

幂级数实现

#!/usr/bin/env python3
x = float(input("Enter the value of x: "))
n = term = num = 1
result = 1.0
while n <= 100:
	term *= x / n
	result += term
	n += 1
	if term < 0.0001:
		break
print("No of Times= {} and Sum= {}".format(n, result))

乘法表

#!/usr/bin/env python3
i = 1
print("-" * 50)
while i < 11:
	n = 1
	while n <= 10:
		print("{:5d}".format(i * n), end=' ')
		n += 1
	print()
	i += 1
print("-" * 50)

以上代码是嵌套循环的代码,从其运行结果可以看出print("-" * 50)的作用

数据结构:列表

列表中的元素不必是同一类型,中间用逗号分隔。
a[256,1,23,'china','love']
其中每一位都有对应的下标,从0开始,可以利用a[4]对应‘love’使用负数索引,就会从尾部开始计数。

切片不会改变正在操作的列表,切片操作会返回其子列表,即一个新的列表副本。
例如: a[1:-2] 表示 [1,23]
	  a[:-2]则表示[256,1,23]

Python 中有关下标的集合都满足左闭右开原则,切片中也是如此,也就是说集合左边界值能取到,右边界值不能取到。

  • 切片长度就是两个索引之差

  • [-1:-5]可以取到全部元素,但[-5:-1]取不到列表中的最后一个值。

  • 切片的上边界大于下边界时,返回空列表;一个过大的索引值将被列表的实际长度所代替

  • 可以检验某个值是否在列表中'cool' ia a

  • 内建函数len()可以获得列表长度

  • 列表允许嵌套

for循环

range()函数可以在for循环需要一个数值序列时使用,具体用法前面提到过。

在循环后面选择else语句,它将会在循环执行完毕后执行

数据结构

Python有许多内建的数据结构
其中包括列表、元组、

列表有关内容

  • 列表a的建立:a = [23, 45, 1, -3434, 43624356, 234]

  • 向列表添末尾加元素:a.append(45) 添加元素 45 到列表末尾。

  • 向列表任何位置添加元素:a.insert()方法

    • a.insert(0,1)在列表0的位置添加元素1
  • 列表计算指定值方法:count(s)会返回列表元素中s的数量

  • 移除任意指定值:remove(s)将会移除在列表中的s值

  • 删除指定位置的值:del()

  • 翻转列表:reverse()

  • 列表排序:sort()前提是列表的元素是可比较的

将列表用作栈和队列

  • pop(i)方法会将第i个元素出栈,例如a.pop(0)将第一个元素弹出列表

  • 列表推导式为从序列中创建列表提供了一个简单的方法

    • 列表推导式由包含一个表达式的中括号组成,表达式后面跟随一个 for 子句,之后可以有零或多个 for 或 if 子句,结果是一个列表。列表推导式也可以嵌套

    squares = [x**2 for x in range(10)]
    该语句组成的序列是[0,1,4,9,16,25,36,47,64,81]

    [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]

    [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

元组

元组是由数个逗号分隔的值所组成,可以对任何一个元组执行拆封操作并赋值给多个变量。

  • 元组是不可变类型,元组内无法进行添加或删除任何值得操作。

  • 要创建只有一个元素的元组,在值得后面跟一个逗号

    • a = 321,相当于(321,)
  • 内建函数type()可以知道任意变量的数据类型;len()可以查询任意序列类型数据长度

集合

集合是一个无序不重复元素的集。基本功能有关系测试和消除重复元素。集合同时还支持数学运算。

  • 大括号或set()函数可以用来创建集合。

  • a = set('abracadabra')得到的a集合是去重后的字母

字典

字典是无序键值对的集合,同一个字典内的键必须是互不相同的。键与值之间利用:分隔。用键来检索存储在字典中的值。

data
{'kushal': 'Fedora', 'Jace': 'Mac', 'kart_': 'Debian'}

查找字典中键对应的值
 data['kart_']
'Debian'

删除字典中任意指定的键值对
del data['kushal']

查询指定关键字是否在字典中
'ShiYanLou' in data

遍历字典
items()方法
for x,y in data.items():
	print("{} uses {}".format(x,y))

向字典中元素多次添加数据
dict.setdefault(key, default)

索引键,如果不存在将返回指定的default值
dict.get(key, default)

在便利列表的同时获得元素的索引值,使用enumerate()
for i, j in enumerate(['a', 'b', 'c']):
此时,列表的索引值将会存放在变量i中

字典中的键必须是不可变类型,比如列表就不能作为键。

输入学生的三科成绩计算是否通过考试

运行结果

代码分析

建立的data字典以学生的姓名作为键,对应的列表中包含的三门成绩作为对应学生的成绩,也就是字典的值。data[name] = marks就是一个创建字典的过程,将对应的列表作为值与姓名形成键值对。3

字符串

当输入几行字符串并且希望行尾换行符自动包含到字符串中,使用三对引号"""....."""'''....'''

字符串的内建方法

  • s.split() 分隔字符串

    语法方法:
    str.split(str="", num=string.count(str)).

    参数
    str -- 分隔符,默认为所有的空字符,包括空格、换行( )、制表符( )等。
    num -- 分割次数。默认为 -1, 即分隔所有。

    返回值
    返回分割后的字符串列表。

  • title()返回字符串的标题版本,即单词首字母大写其余字母小写

  • upper() 返回字符串的全部大写版本

  • lower()返回字符串的全部小写版本

  • swapcase() 返回字符串大小写交换后的版本

  • isalnum() 检查所有字符是否只包含数字和字母

  • isal
    -pha() 检查字符串是否只有字母

  • join() 使用指定字符连接多个字符串

    "-".join("GNU/Linux is great".split())
    'GNU/Linux-is-great'

  • lstrip(chars)或rstrip(chars) 对字符串左或右剥离

  • find()可以找到字符串中第一个匹配的字符串

检查回文数

将字符串倒序的方式 z = s[::-1]
这是前面提到的切片的方法,可以对列表、元组等使用。

假如 a = (1,2,3,4,5)
那么 a[:] a[::] 都代表(1,2,3,4,5)使用默认值a[0:len(a):1]
前面提到过a[0:2]表示a(1,2)

在本题中a[::-1]表示步长为负数,从序列的最后一个元素开始切片,即倒序

函数

定义一个函数

使用关键字def定义函数

def 函数名(参数):
	语句1
	语句2

将回文判断写成一个函数

#!/usr/bin/env python3
def palindrome(s):
    return s == s[::-1]
if __name__ == '__main__':
    s = input("Enter a string: ")
    if palindrome(s):
        print("Yay a palindrome")
    else:
        print("Oh no, not a palindrome")

在这里很疑惑 name == 'main' 的作用是什么,参考一篇博客,明白__name__是函数的内置变量,详细参考博客https://blog.csdn.net/xyisv/article/details/78069129

局域或全局变量

在函数中创建的变量是局域变量,只在函数中可用,函数完成时销毁。同样在函数中,变量出现在表达式等号之前,就会被当做局部变量。

使用global关键字,对函数中的a标志为全局变量,让函数内部使用全局变量a,那么整个程序中出现a都将是一样的。

默认参数值

函数参数变量可以有默认值,如果对指定的参数变量没有给出任何值,则会赋其任意值。
def test(a , b=-99):
if a > b:
return True
else:
return False

需要注意的是:
- 具有默认值的参数后面不能再有普通参数

高阶函数

高阶函数或仿函数是可以接受函数作为参数的函数

map函数

它接受一个函数和一个序列(迭代器)作为输入,然后对序列(迭代器)的每一个值应用这个函数,返回一个序列(迭代器),其包含应用函数后的结果。

lst = [1, 2, 3, 4, 5]
	return num * num
print(list(map(square, lst)))
[1, 4, 9, 16, 25]

文件处理

文件打开

使用open()函数打开文件,需要两个参数,第一个是文件路径或文件名;第二是文件的打开方式

  • r 只读 (默认模式)
  • w 写入 删除文件内所有内容,打开文件进行写入
  • a 追加 写入到文件中的数据添加到末尾

文件关闭

使用close()关闭文件

文件读取

read()方法一次性读取整个文件。

  • read()有一个可选参数size用来返回指定字符串长度,如果没有指定size或size为负数,会读取整个文件

  • readline()每次读取文件的一行

    • readlines()读取所有行到一个列表中

文件写入

write()方法打开文件然后随便写入一些文本

拷贝文本文件到另一个给定文本文件

#!/usr/bin/env python3
import sys
if len(sys.argv) < 3:
    print("Wrong parameter")
    print("./copyfile.py file1 file2")
    sys.exit(1)
f1 = open(sys.argv[1])
s = f1.read()
f1.close()
f2 = open(sys.argv[2], 'w')
f2.write(s)
f2.close()

用到了sys模块的sys.argv函数,一开始不明的到底这个函数的功能是什么,参考了一篇博客,了解到sys.argv其实是外部命令与程序内部的桥梁,是一个列表,所以可以通过argv[]进行调用。
https://www.cnblogs.com/aland-1415/p/6613449.html

运行结果如图所示:

异常

在程序执行过程中发生的任何错误都是异常。每个异常显示一些相关的错误信息。

  • NameError访问一个未定义变量时会发生NameError异常

  • TypeError当操作或函数应用于不适当类型的对象时引发

处理异常

使用try...except快处理异常。

  • 首先,执行 try 子句 (在 try 和 except 关键字之间的部分)。

  • 如果没有异常发生,except 子句 在 try 语句执行完毕后就被忽略了。

  • 如果在 try 子句执行过程中发生了异常,那么该子句其余的部分就会被忽略。

  • 如果异常匹配于 except 关键字后面指定的异常类型,就执行对应的 except 子句。然后继续执行 try 语句之后的代码。

  • 如果发生了一个异常,在 except 子句中没有与之匹配的分支,它就会传递到上一级 try 语句中。

  • 如果最终仍找不到对应的处理语句,它就成为一个 未处理异常,终止程序运行,显示提示信息。

一个空的except()语句可以捕获任何异常。

抛出异常

使用raise()语句抛出异常

定义清理行为

try语句还有另一个可选的finally字句,在于定义任何情况下都一定要执行的功能。

不管有没有发生异常,finally 子句 在程序离开 try 后都一定会被执行。当 try 语句中发生了未被 except 捕获的异常(或者它发生在 except 或 else 子句中),在 finally 子句执行完后它会被重新抛出。

定义方式

class nameoftheclass(parent_class):
    statement1
    statement2
    statement3

类的实例

x = MyClass()

以上类的实例用于创建一个空对象,创建一个有初始状态的类,需要用到方法 init()进行初始化。

继承

当一个类继承另一个类时,它将继承父类的所有功能(如变量和方法)。这有助于重用代码。

继承方式:

class Person(object):
def init(self,name):
def get_details(self):
class Student(Person):
class Teacher(Person):

有了init方法后,在创建类的对象时,不需要调用init方法,直接调用类的初始化方法即可。

person1 = Person('Sachin')
student1 = Student('Kushal', 'CSE', 2005)
teacher1 = Teacher('Prashad', ['C', 'C++'])

删除对象

del s 来删除对象

装饰器

你可能想要更精确的调整控制属性访问权限,你可以使用 @property 装饰器,@property 装饰器就是负责把一个方法变成属性调用的。

模块

模块是包括 Python 定义和声明的文件。文件名就是模块名加上 .py 后缀。__name__全局变量可以得到模块的模块名。

模块内的函数必须要用模块名来访问。
bars.hashbar(10)

bars.simplebar(10)

bars.starbar(10)

含有__init__.py文件的目录可以用来作为一个包,其中目录里的所有.py文件都是这个包的子模块

如果 init.py 文件内有一个名为 all 的列表,那么只有在列表内列出的名字将会被公开。

默认模块

  • os模块 提供了与操作系统相关的功能

    • getuid() 函数返回当前进程的有效用户 id
    • getpid() 函数返回当前进程的 id。getppid() 返回父进程的 id
    • uname() 函数返回识别操作系统的不同信息,在 Linux 中它返回的详细信息可以从 uname -a 命令得到。
    • getcwd() 函数返回当前工作目录。chdir(path) 则是更改当前目录到 path。
  • Requests模块

    • 属于第三方模块,使用前需要安装

    sudo apt-get update
    sudo apt-get install python3-pip
    sudo pip3 install requests

    • get()方法可以获取任意一个网页

从指定URL下载文件的程序

#!/usr/bin/env python3
import requests

def download(url):

# 检查 URL 是否存在
try:
	req = requests.get(url)
except requests.exceptions.MissingSchema:
	print('Invalid URL "{}"'.format(url))
	return
# 检查是否成功访问了该网站
if req.status_code == 403:
	print('You do not have the authority to access this page.')
	return
filename = url.split('/')[-1]
with open(filename, 'w') as fobj:
	fobj.write(req.content.decode('utf-8'))
	print("Download over.")

if __name__ == '__main__':
url = input('Enter a URL: ')
download(url)

conllections模块

counter

counter是一个有助于hashable对象计数的dict子类。它是一个无序的集合,其中 hashable 对象的元素存储为字典的键,它们的计数存储为字典的值,计数可以为任意整数,包括零和负数。

  • elements() 方法 依照计数重复重复元素相同次数,元素顺序是无序的。
  • most_common() 方法返回最常见的元素及其计数,顺序为最常见到最少。

defaultdict

defaultdict() 第一个参数提供了 default_factory 属性的初始值,默认值为 None,default_factory 属性值将作为字典的默认数据类型。所有剩余的参数与字典的构造方法相同,包括关键字参数。

namedtuple

命名元组有助于对元组每个位置赋予意义,并且让我们的代码有更好的可读性和自文档性。你可以在任何使用元组地方使用命名元组。在例子中我们会创建一个命名元组以展示为元组每个位置保存信息。

迭代器、生成器、装饰器

迭代器

  • iter_(),返回迭代器对象自身。这用在 for 和 in 语句中。

  • next(),返回迭代器的下一个值。如果没有下一个值可以返回,那么应该抛出 StopIteration 异常。

生成器

生成器是更简单的创建迭代器的方法,这通过在函数中使用 yield 关键字完成。

def counter_generator(low, high):
while low <= high:
	yield low
	low += 1

for i in 	counter_generator(5,10):
	print(i, end=' ')
 
5 6 7 8 9 10

在 While 循环中,每当执行到 yield 语句时,返回变量 low 的值并且生成器状态转为挂起。在下一次调用生成器时,生成器从之前冻结的地方恢复执行然后变量 low 的值增一。也就是说,在下一次执行生成器前,low的值不会改变。

虚拟Python环境virtualenv

安装两个不用的虚拟环境,并激活source virt1/bin/activate

安装redis这个Python模块

安装另一个虚拟环境,并安装不同版本的redis以满足不同的编程需要

测试

单元测试

在 Python 里我们有 unittest 这个模块来帮助我们进行单元测试。

首先导入了 unittest 模块,然后测试我们需要测试的函数。

测试用例是通过子类化 unittest.TestCase 创建的。

覆盖测试率

测试覆盖率是找到代码库未经测试的部分的简单方法。它并不会告诉你的测试好不好。

项目结构

假设实验项目名为factorial创建/home/shiyanlou/factorial,将要创建的Python模块取名为myfact,创建目录/home/shiyanlou/factorial/myfact。主代码放在fact.py文件中,模块的__init.py__文件,将设定目录显示的文件。

/home/shiyanlou/factorial/MANIFEST.in 文件,它用来在使用 sdist 命令的时候找出将成为项目源代码压缩包一部分的所有文件。

最终我们需要写一个 /home/shiyanlou/factorial/setup.py,用来创建源代码压缩包或安装软件。

要创建一个源文件发布版本,执行以下命令。

python3 setup.py sdist

我们能在 dist 目录下看到一个 tar 压缩包。执行下面的命令从源代码安装。

sudo python3 setup.py install

Flask框架基本使用

Flask 是一个 web 框架。也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序。这个 web 应用程序可以是一些 web 页面、博客、wiki、基于 web 的日历应用或商业网站。

Flask 属于微框架(micro-framework)这一类别,微架构通常是很小的不依赖于外部库的框架。这既有优点也有缺点,优点是框架很轻量,更新时依赖少,并且专注安全方面的 bug,缺点是,你不得不自己做更多的工作,或通过添加插件增加自己的依赖列表。

Flask 的依赖如下:

  • Werkzeug 一个 WSGI 工具包
  • jinja2 模板引擎

WSGI

Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。

flask框架使用

  • templates 文件夹是存放模板的地方,
  • static 文件夹存放 web 应用所需的静态文件(images, css, javascript)。

hello_flask.py 文件里编写如下代码:

运行flask程序

了解了微框架、WSGI、模板引擎等概念,学习使用 Flask 做一个 web 应用,在这个 web 应用中,我们使用了模板。而用户以正确的不同 URL访问服务器时,服务器返回不同的网页。


以上是这周在实验楼学习的关于Python3的相关知识,但是因为时间有限,很多内容还有待进一步深入,很多内容掌握的也不是很牢固,需要在以后的学习实践中不断巩固深入。

原文地址:https://www.cnblogs.com/zz-1226/p/10507218.html