Python基础篇(总结)
这一篇文章是对前一段基础学习的遗漏补充和总结。之前的文章写完了Python之路Day1,2,3,这篇文章也会包含Python之路Day4,5。放上链接
编程语言(Programming languages)
Machine languages –> Assembly languages –> high-level languages
为什么要在提到这个问题呢?我觉得我们应该记住编程语言是如何一步步发展过来的,而我们现在所使用的大多数编程语言都是high-level languages(高级语言)毕竟user-friendly还是很重要,开发效率也更高。而之前提到的高级语言中的编译性和解释型语言在这篇就不多提了。但需要强调的是Python是一门先编译后解释的语言
字符编码(Character encoding)
Python2.X和Python3.X的默认编码是不同的,这也就是为什么我们看到好多代码文件需要在文件开始处注释如何编码。例如:--coding:utf-8 --
1.Python2 ASCII
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)
2.Python3 Unicode
ASCII码无法将世界上的各种文字和符号全部表示,所以,就需要新出一种可以代表所有字符和符号的编码,即:Unicode
编码与解码(Encoding and decoding)
- 将字符串已utf-8形式编码
- 将编码后的字符串再已utf-8形式解码输出
1
2
3
4
5
6
7
8
9s='昊'
utf8=s.encode('utf-8')
m=utf8.decode('utf-8')
print(s)
print(type(s))
print(utf8)
print(type(utf8))
print(m)上面提到的文件编码方式都是Python解释器中的默认编码方式,所以不同语言已unicode加载到内存中,程序就可以正常显示。我们也可以发现字符在已utf-8编码后,字符格式为bytes而不是之前的str1
2
3
4
5昊
<class 'str'>
b'\xe6\x98\x8a'
<class 'bytes'>
昊函数
内置函数(Built-in functions)
列举一些常见的内置函数
- strip()
- open()
- len()
- range()
- isdigit()
- enumerate()(索引)
1
2
3list=["a","b","c"]
for count,list in enumerate (list 1):
print(count,list,sep=' ') - map()(映射)
1
2
3
4
5
6list_num=[1,2,3]
def func(x):
return x+1
a=map(func,list_num)
print(a)
print(list(a)) - lambda()(匿名函数)
1
2
3a=lambda x:x+1
for i in range(3):
print(a(i))装饰器,生成器,和迭代器
装饰器(Decorator)
我的理解的装饰器概念是为要执行的函数来提前进行修饰。而修饰可以是为函数增加执行要求。登陆验证是一个很好的例子来学习装饰器。如果用户登陆后不必反复验证用户身份。教程中有对这一部分的详细解释,而我下面用更简单的代码来为装饰器举例。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#defining a decorator
n=False
def decorator(func):
def inner(*args,**kwargs):
global n
if n==False:
password=input("pwd:")
if password=='1234':
print("nice to meet you!")
n=True
print(n)
res = func(*args,**kwargs)
return res
if n==True:
res = func(*args,**kwargs)
return res
return inner1
2
3
4
5
6
def test():
print("nice to meet you too!")
def test2():
print("good to see you again!")1
2
3
4#第一次执行程序时,需输入密码来执行后续函数
test()
#跳过输入密码步骤,直接执行后续函数
test2()
输出:
1 | pwd:1234 |
生成器和迭代器(Generator and Iterator)
迭代器在执行时通过对生成器函数的不断调用来运算出新的对象,直到所有的参数被访问完毕。为了避免无限循环的产生,可以通过raise StopIteration
来终止结束迭代。
斐波那契函数(Fibonacci )
1 | def fibonacci(n): #generator |
模块(Modules)
模块分类:
- 标准库 (顾名思义就是安装Python时程序自带的模块)
- 开源模块 (网络上共享的开源模块)
- 自定义(用户自己编写的模块)
我们编写程序时调用其他文件里的代码就是对模块的一种调用。而我们对特定的内置函数使用,有时也必须先调用内置函数相关的模块。 举例:我们在用Python做数据分析时,常常调用numpy,matplotlib,或pandas。或者我们制作区块链时(Blockchain)需要调用哈希算法对数据进行加密处理
1 | Import hashlib as hasher |
1 | import pandas as pd |
By the way: 区块链也是值得学习和探讨的技术,以后也可以单独写一篇文章来总结以下。
json & pickle
- json:只可以用于字符串或者字典等与python数据类型之间的序列化与反序列化之间的操作
- pickle:可以用于python类有类型与python数据类型之间的序列化与反序列化的操作
四个主要功能:dumps,dump,loads,load
json模块的使用例子会在后面练习代码的部分展示出来。
练习代码(Practice code)
简单模拟ATM功能
经验:没有简单的代码,只有不熟悉的代码。写代码方式千奇百怪,总有更优化的代码。我们都在摸索中进步!
遇到的困难既总结(看似小的问题有时会花费好几个小时解决):
- json文件load和dump时不能处理多个对象
- json数据更新后,原有数据消失,格式错误。(当我们处理文件数据时,我们会使用read,write和append对目标对象进行加工。ATM程序需要更新数据,而不是添加或者覆盖)解决方法在accounts.py里的dumps_modify()函数。总感觉自己的解决方法有点笨拙,但是没有查到…
- 函数返回值不更新(调用错误参数)
1 | #程序中的代码操作都是基于下面数据格式进行更改,更新和处理的 |
1.main.py
1 | #程序入口(Program entrance) |
2.atm_admin.py
1 | #管理员界面(Admin Menu) |
3.atm_users.py
1 | #普通用户界面(users menu) |
4.accounts.py
1 | #账户信息处理文件(handling the data change) |