1、学习资料汇总
1.1 入门资料
1.1.1 资料
1.1.2 教程
1.1.3 源码
1.1.4 博客
2、学习总结
2.1 基础知识
- 模块
标准的Python文件格式
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' a test module '
__author__ = 'Michael Liao'
import sys
def test():
args = sys.argv
if len(args)==1:
print('Hello, world!')
elif len(args)==2:
print('Hello, %s!' % args[1])
else:
print('Too many arguments!')
if __name__=='__main__':
test()
第1行和第2行是标准注释,第1行注释可以让这个hello.py
文件直接在Unix/Linux/Mac上运行,第2行注释表示.py文件本身使用标准UTF-8编码;
第4行是一个字符串,表示模块的文档注释,任何模块代码的第一个字符串都被视为模块的文档注释;
第6行使用__author__
变量把作者写进去,这样当你公开源代码后别人就可以瞻仰你的大名;
以上就是Python模块的标准文件模板,当然也可以全部删掉不写,但是,按标准办事肯定没错。
2.2 特殊语法
2.2.1 关键字
- __name__
if __name__ == '__main__':
main()
python有两种执行,一种是直接调用,另一种是 通过 import到另外的模块里面
直接调用的时候 __name__ 为 __main__
import的时候 __name__ 为脚本的文件名
2.2.2 // 运算符
// 运算符表示整数除法
2.2.3 None 的用法
None表示空值,它是一个特殊 Python 对象, None的类型是NoneType
NoneType 是一类特别的类型,而且该值几乎没有任何可以做的操作
由于每个变量一定要有一个值,必须指向一个对象,在我们不知道其应该取什么值时就可以让其等于 None
2.2.4 类里面的 self 理解
类里面 __init__()面定义的第一个变量self(也可不用self命名),表示创建的实例本身。
class Test(object):
def __init__(self, da):
self.da = da
print('self type:',type(self))
print('self id:',id(self))
print('self.da id:',id(self.da))
def main():
test = Test(0)
print('test type:', type(test))
print('test id:', id(test))
if __name__=='__main__':
main()
$ python class.py
self type: <class '__main__.Test'>
self id: 31521816
self.da id: 8791307965440
test type: <class '__main__.Test'>
test id: 31521816
2.2.5 __slots__ 限制类的属性
2.2.6 with 的理解
with时python会自动调用对象的__enter__ 函数,离开with时会调用 __exit__ 函数
测试代码:
class Connection(object):
def __enter__(self):
print('enter')
return self
def __exit__(self, type, value, traceback):
print('exit')
def say_hi(self):
print('hello, world')
def open_connection():
return Connection()
with open_connection() as conn:
conn.say_hi()
执行结果:
$ python ex3.py
enter
hello, world
exit
2.2.7 Python里的 变量、参数的理解
测试代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Version: 0.1
Author: Cjx
Date: 2020-11-19
understand variable.
"""
__author__ = 'Cjx'
def test(none_para, bool_para, int_para, str_para, list_para, tuple_para, dick_para, set_para):
print()
print('print no change parameter addr >>>')
print('none_para addr:', id(none_para))
print('bool_para addr:', id(bool_para))
print('int_para addr:', id(int_para))
print('str_para addr:', id(str_para))
print('list_para addr:', id(list_para))
print('tuple_para addr:', id(tuple_para))
print('dick_para addr:', id(dick_para))
print('set_para addr:', id(set_para))
none_para = 0
bool_para = False
int_para = 0
str_para = str_para.upper()
list_para[0] = 1
dick_para['1'] = 0
set_para.add(0)
print()
print('print once change parameter addr >>>')
print('none_para addr:', id(none_para))
print('bool_para addr:', id(bool_para))
print('int_para addr:', id(int_para))
print('str_para addr:', id(str_para))
print('list_para addr:', id(list_para))
print('tuple_para addr:', id(tuple_para))
print('dick_para addr:', id(dick_para))
print('set_para addr:', id(set_para))
print()
print('print once change parameter data >>>')
print('none_para:', none_para)
print('bool_para:', bool_para)
print('int_para:', int_para)
print('str_para:', str_para)
print('list_para:', list_para)
print('tuple_para:', tuple_para)
print('dick_para:', dick_para)
print('set_para:', set_para)
none_para = 1
bool_para = True
int_para = 1
str_para = str_para.lower()
list_para[0] = 1
dick_para['1'] = 1
set_para.add(1)
print()
print('print twice change parameter addr >>>')
print('none_para addr:', id(none_para))
print('bool_para addr:', id(bool_para))
print('int_para addr:', id(int_para))
print('str_para addr:', id(str_para))
print('list_para addr:', id(list_para))
print('tuple_para addr:', id(tuple_para))
print('dick_para addr:', id(dick_para))
print('set_para addr:', id(set_para))
print()
print('print twice change parameter data >>>')
print('none_para:', none_para)
print('bool_para:', bool_para)
print('int_para:', int_para)
print('str_para:', str_para)
print('list_para:', list_para)
print('tuple_para:', tuple_para)
print('dick_para:', dick_para)
print('set_para:', set_para)
def main():
none_data = None
bool_data = True
int_data = 1
str_data = 'a2345'
list_data = [1, 2, 3, 4, 5]
tuple_data = (1, 2, 3, 4, 5)
dick_data = {'1':1, '2':2, '3':3, '4':4, '5':5}
set_data = set([1, 2, 3, 4, 5])
test(none_data, bool_data, int_data, str_data, list_data, tuple_data, dick_data, set_data)
print()
print('print variable addr >>>')
print('none_data addr:', id(none_data))
print('bool_data addr:', id(bool_data))
print('int_data addr:', id(int_data))
print('str_data addr:', id(str_data))
print('list_data addr:', id(list_data))
print('tuple_data addr:', id(tuple_data))
print('dick_data addr:', id(dick_data))
print('set_data addr:', id(set_data))
print()
print('print variable data >>>')
print('none_data:', none_data)
print('bool_data:', bool_data)
print('int_data:', int_data)
print('str_data:', str_data)
print('list_data:', list_data)
print('tuple_data:', tuple_data)
print('dick_data:', dick_data)
print('set_data:', set_data)
if __name__=='__main__':
main()
结果
print no change parameter addr >>>
none_para addr: 8791304727776
bool_para addr: 8791304681808
int_para addr: 8791305212960
str_para addr: 41750968
list_para addr: 5005896
tuple_para addr: 5073032
dick_para addr: 5466152
set_para addr: 41696392
print once change parameter addr >>>
none_para addr: 8791305212928
bool_para addr: 8791304681840
int_para addr: 8791305212928
str_para addr: 41751696
list_para addr: 5005896
tuple_para addr: 5073032
dick_para addr: 5466152
set_para addr: 41696392
print once change parameter data >>>
none_para: 0
bool_para: False
int_para: 0
str_para: A2345
list_para: [1, 2, 3, 4, 5]
tuple_para: (1, 2, 3, 4, 5)
dick_para: {'1': 0, '2': 2, '3': 3, '4': 4, '5': 5}
set_para: {0, 1, 2, 3, 4, 5}
print twice change parameter addr >>>
none_para addr: 8791305212960
bool_para addr: 8791304681808
int_para addr: 8791305212960
str_para addr: 41751752
list_para addr: 5005896
tuple_para addr: 5073032
dick_para addr: 5466152
set_para addr: 41696392
print twice change parameter data >>>
none_para: 1
bool_para: True
int_para: 1
str_para: a2345
list_para: [1, 2, 3, 4, 5]
tuple_para: (1, 2, 3, 4, 5)
dick_para: {'1': 1, '2': 2, '3': 3, '4': 4, '5': 5}
set_para: {0, 1, 2, 3, 4, 5}
print variable addr >>>
none_data addr: 8791304727776
bool_data addr: 8791304681808
int_data addr: 8791305212960
str_data addr: 41750968
list_data addr: 5005896
tuple_data addr: 5073032
dick_data addr: 5466152
set_data addr: 41696392
print variable data >>>
none_data: None
bool_data: True
int_data: 1
str_data: a2345
list_data: [1, 2, 3, 4, 5]
tuple_data: (1, 2, 3, 4, 5)
dick_data: {'1': 1, '2': 2, '3': 3, '4': 4, '5': 5}
set_data: {0, 1, 2, 3, 4, 5}
由上面的结果,变量、参数只是存储指向对象(变量类型的实例)的id, 当右边创造或返回新的对象时,相应的id就变了
2.2.8 闭包与装饰器理解
测试代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Version: 0.1
Author: Cjx
Date: 2020-12-1
understand decorator.
"""
__author__ = 'Cjx'
import functools
import datetime
import time
def log(func):
h = []
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
h.append('1')
print(h)
return func(*args, **kw)
return wrapper
@log
def dnow():
print(time.strftime("%Y%m%d%H%M%S",time.localtime(time.time())))
def now():
print(time.strftime("%Y%m%d%H%M%S",time.localtime(time.time())))
def main():
f1 = log(now)
f2 = f1
print(f1)
print(f2)
f1()
f1()
f2()
f2()
f3 = log(now)
print(f3)
f3()
f3()
f3()
print(dnow)
dnow()
dnow()
dnow()
if __name__=='__main__':
main()
运行结果
E:\GitHub\Python_Test\grammar>decorator.py
<function log.<locals>.wrapper at 0x00000000027C1E18>
<function log.<locals>.wrapper at 0x00000000027C1E18>
call now():
['1']
20201202105553
call now():
['1', '1']
20201202105553
call now():
['1', '1', '1']
20201202105553
call now():
['1', '1', '1', '1']
20201202105553
<function log.<locals>.wrapper at 0x00000000027C1950>
call now():
['1']
20201202105553
call now():
['1', '1']
20201202105553
call now():
['1', '1', '1']
20201202105553
<function log.<locals>.wrapper at 0x0000000002799950>
call dnow():
['1']
20201202105553
call dnow():
['1', '1']
20201202105553
call dnow():
['1', '1', '1']
20201202105553
首先我们理解闭包,闭包是由返回函数带来的,返回函数的同时,还会把相关参数跟局部变量也返回,所以一直执行闭包函数后,会一直插入数据。
而装饰器如果修饰的是函数,那这个函数就是提前对象化的闭包函数, 就是不需要你再去写一个返回函数的语句,这个函数就已经是一个闭包函数了。
2.2.9 import的理解
module_test.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Version: 0.1
Author: Cjx
Date: 2020-12-13
understand import module.
"""
__author__ = 'Cjx'
import os
gg = os.path.split(__file__)[-1].split(".")[0] + ' global var'
class test_class(object):
def run():
print('%s test_class' % os.path.split(__file__)[-1].split(".")[0])
def test_func():
print('%s test_func' % os.path.split(__file__)[-1].split(".")[0])
def main():
test_func()
test_class.run()
pass
if __name__=='__main__':
main()
import.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Version: 0.1
Author: Cjx
Date: 2020-12-13
understand import principle.
"""
__author__ = 'Cjx'
import module_test
from module_test import test_class
from module_test import test_class as my_test_class
def main():
module_test.test_func()
a = module_test.test_class
a.run()
b = test_class
b.run()
print(module_test.gg)
print(id(module_test))
print(id(module_test.test_class))
print(id(a))
print(id(b))
print(id(my_test_class))
if __name__=='__main__':
main()
输出结果
E:\GitHub\Python_Test\grammar>import.py
module_test test_func
module_test test_class
module_test test_class
module_test global var
31659976
41351016
41351016
41351016
41351016
2.3 常见问题
2.3.1 input输入
intput在输入的都说字符串,所以在输入数字的时候要转换一下,不能直接拿去运算
inch = float(input("Please input inches:"))
2.3.2 多重继承优先用那个父类的方法
代码:
class FatherA(object):
def __init__(self, name):
self._name = name
def run(self):
print('%s in FatherA class' % self._name)
class FatherB(object):
def __init__(self, name):
self._name = name
def run(self):
print('%s in FatherB class' % self._name)
def runB(self):
print('%s in FatherB class' % self._name)
class Test(FatherA, FatherB):
def __init__(self, name):
self.name = name
FatherA.__init__(self, name)
FatherB.__init__(self, name)
def main():
test = Test('cjx')
test.run()
test.runB()
运行结果:
Administrator@KTB7DTYIZZ9SQQM MINGW64 /e/GitHub/Python_Test/grammar (main)
$ python multi.py
cjx in FatherA class
cjx in FatherB class
由于Python是动态语言,所以当两个父类中有一样的方法时,先找到那个方法就用那个方法,由于 FatherA 在FatherB之前所以先调用FatherA中的run
2.3.3 pip install 出错
pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443)
出现这个问题是访问的是国外网站,我们可以用国内的包地址
pip install pillow -i https://pypi.doubanio.com/simple