Python 学习调试记录

1、学习资料汇总

1.1 入门资料

1.1.1 资料

        python官网            

       Python 第三方库              

       异常类型关系          

       定制方法参考文档            

      正则表达式参考手册             

      web学习资料          

      pygame 下载

1.1.2 教程     

      廖雪峰教程          

     500 Lines or Less Github EN                   

     500LineorLess_CN        

     500 Line or Less 官网

1.1.3 源码

     100天学习Python Github                      

     优质Python项目汇总          

     Python练手项目

1.1.4 博客

      官方vc++运行库工具一键式解决

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习 Python 更高效,有几个方法可以帮助你: 1. 设置明确的学习目标:确定你想要学习Python 领域和技能,并将其细分成具体的目标。这有助于你更有条理地学习和追踪进展。 2. 寻找优质学习资源:选择适合自己的学习资源,如在线教程、教科书、视频教程、编程网站等。确保资源内容清晰易懂,并提供代码示例和练习题。 3. 练习实践:理论学习只是第一步,实践是深化理解和掌握技能的关键。尝试编写自己的小项目,解决实际问题,并挑战一些编程练习题。 4. 参与社区和交流:加入 Python 的社区,参与讨论、提问和回答问题。这样可以加深理解,获得反馈,并与其他学习者交流经验和知识。 5. 创造学习计划:制定每天或每周的学习计划,并保持持续的学习动力。将时间分配给不同主题,例如语法基础、数据结构、Web 开发等。 6. 使用调试工具:熟悉并使用调试工具,如断点调试器和日志记录工具。这将帮助你找到和解决代码中的错误,并提高调试技巧。 7. 阅读优秀的 Python 代码:阅读他人写的高质量 Python 代码,可以学习到新的编码技巧和最佳实践。 8. 持续学习和更新:Python 是一个不断发展的编程语言,持续学习并了解最新的语言特性和库是保持高效学习的关键。 希望这些建议对你有帮助!祝你学习 Python 的过程愉快!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值