首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

Python 高级编程读书笔记(一)

  •  
  •   cxa · 2018-11-07 09:06:59 +08:00 · 1907 次点击
    这是一个创建于 398 天前的主题,其中的信息可能已经有所发展或是发生改变。

    python 高级编程读书笔记(一)

    python 高级编程读书笔记,记录一下基础和高级用法

    python2 和 python3 兼容处理

    使用 sys 模块使程序 python2 和 python3 兼容

    import sys
    
    ver=sys.version_info
    #(major=3, minor=6, micro=6)
    
    if ver<(3,0,0):# 3 是版本号,0 是此版本号,第二个 0 修订号。
    	import urllib2
    else:
       import urllib 
    

    获取当前环境所用的 python 包

    pip freeze
    

    会发现输出的所有的 python 包,包括 python 标准库的,所以独立的 python 运行环境很重要,使用 virtualenv 或者 pipenv 建立独立的 python 环境很重要。 之后复制所有使用的模块到 requirements.txt 文件里。

    requirements.txt 的用法

    这个文件含有当前项目使用的 python 包为了避免一个一个安装项目中缺失的包我们一般用。

    pip install -r requirements.txt
    

    即可安装当前项目使用的包。

    使用 pdb 模块交互式调试

    import pdb
    pdb.set_trance()
    

    命令 n:执行下一步,其他的命令可以通过

    help pdb 
    

    进行获取。

    zip 均匀分配迭代对象

    for i in zip(["name","sex","age"],["张三","男",25]):
    	print(i)
    

    输出

    ('name', '张三')
    ('sex', '男')
    ('age', 25)
    

    两个列表转化为字典的形式

    print(dict(zip(["name","sex","age"],["张三","男",25])))
    

    输出

    {'name': '张三', 'sex': '男', 'age': 25}
    

    序列解包

    a,b,c=("this","is","seq")
    a1,*b1,c1=("this","is","seq",'tuple')
    a2,b2,*c2=("this","is","seq",'tuple')
    print(a)
    print(b1)
    print(c2)
    

    输出

    this
    ['is', 'seq']
    ['seq', 'tuple']
    

    字典推导式

    d={f"num{num}":num**2 for num in range(10)}
    print(d)
    

    输出

    {'num0': 0, 'num1': 1, 'num2': 4, 'num3': 9, 'num4': 16, 'num5': 25, 'num6': 36, 'num7': 49, 'num8': 64, 'num9': 81}
    

    for....else 语句

    在 for 后面加 else 的语句,表示是 for 循环自然结束的而不是因为 break 结束的。

    
    for  i in range(10):
    	if i==6:
    		break
    
    else:
    	print("跳出循环")
    
    
    for  i in range(10):
    	if i==6:
    		pass
    
    else:
    	print("自然循环结束")	
    

    输出

    自然循环结束
    

    函数注解

    def foo(num:4>5 and 6>7)->(6666):
    	return num+1
    print(foo(5))
    

    参数的冒号后计算注解值的表达式,->填入返回值类型 以上这种注解只会让人糊涂没什么卵用。

    描述符

    class RevealAcess(object):
        def __init__(self, initval=None, name='var'):
            self.val = initval
            self.name = name
    
        def __get__(self, obj, objtype):
            print("Retrieving", self.name)
            return self.val
    
        def __set__(self, obj, val):
            print("updating", self.name)
            self.val = val
    
    
    class MyClass(object):
        x = RevealAcess(10, 'var "x"')
        y = 5
    
    
    if __name__ == "__main__":
        m = MyClass()
        print(m.x)
        m.x = 20
        m.x
        print(m.y)
    

    输出

    Retrieving var "x"
    10
    updating var "x"
    Retrieving var "x"
    5
    

    如果一个类的某个属性有数据描述符(含有_get_, __set__方法的类称之为数据描述符), 通过上述的例子可以知道,每次读取属性的时候会调用 __get__方法 每次对属性赋值的时候调用__set__方法,只实现了__get__的称之为非数据描述符。

    延迟求值属性

    import pymongo
    class A():
        def __init__(self):
            self._client = None
    
        def __get__(self, instance, owner):
            if self._client is None:
                print("创建 mongodb 连接")
                self._client = pymongo.MongoClient(host='127.0.0.1',port=27017,maxPoolSize=10)
            else:
                print('使用存在连接!')
            return self._client
    class B():
        db=A()
    
    if __name__ == '__main__':
        m=B()
        print(m.db)
        print(m.db)
    

    如果 mongodb 的连接已经建立就不重新创建了。单例模式的一种。实例之间共享属性达到节省资源的目的。

    property 的使用

    from requests_html import HTMLSession
    
    
    class Spider():
        __slots__ = ['url', 'new_url', 'session']  # 冻结属性
    
        def __init__(self):
            self.url = "https://www.baidu.com"
            self.new_url = None
            self.session = HTMLSession()
    
        @property
        def get_url(self):
            return self.url
    
        @get_url.setter
        def get_url(self, key):
            self.url = f'{self.url}/s?wd={key}'
    
        def get_html(self):
            req = self.session.get(self.url)
            if req.status_code == 200:
                return req.text
    
    
    if __name__ == '__main__':
        s = Spider()
        s.get_url = 'python'
        print(s.get_html())
    

    使用 property 装饰器修饰函数 get_url,在调用的时候就可以当属性直接调用, 然后在此基础上定义同名函数,使用同名函数装饰器的 setter 方法修饰函数,可以实现赋值的功能。

    更多工具使用以及 python 技巧,请关注公众号:python 学习开发。

    25 回复  |  直到 2018-11-18 13:15:12 +08:00
        1
    111111111111   2018-11-07 09:29:09 +08:00 via Android   ♥ 3
    这个也叫 Python 高级?
        2
    ltoddy   2018-11-07 09:31:20 +08:00
    题目叫:  Python 高级编程读书笔记

    可你说的都是入门的时候就应该掌握的啊.
        3
    ladypxy   2018-11-07 09:36:31 +08:00
    从头看到尾巴,发现我这个看了不到 10 小时 python 的居然都能看懂。。
        4
    silhouette   2018-11-07 09:40:00 +08:00 via Android
    推广
        5
    PythonAnswer   2018-11-07 10:04:48 +08:00
    感觉是初级刚过的内容

    此外
    for else 不建议使用
        6
    qwe61655   2018-11-07 10:28:26 +08:00 via iPhone
    支持
        7
    richzhu   2018-11-07 10:30:37 +08:00
    支持 Mark,坐等楼主出二
        8
    snoopy1024   2018-11-07 10:32:27 +08:00 via Android
    @111111111111 要不你发一个?
        9
    snoopy1024   2018-11-07 10:33:03 +08:00 via Android
    @ltoddy 要不你也发一个?
        10
    xpresslink   2018-11-07 10:39:45 +08:00
    @ltoddy 认真你就输了,有本书叫《 python 核心编程》结果内容都是外围初级内容。
    Python 混到高手基本上就不看书了,要去看一些大牛的博客文章。
        11
    111111111111   2018-11-07 11:09:01 +08:00 via Android
    @snoopy1024 发不发的是个人自由,你随意我尊重你,但是这么水的内容起还说什么高级编程的就过分了

    用 sys 判断 python3?
    `import six;six.PY3`

    pip freeze 以后把内容复制到 requirements.txt ??
    ’ pip freeze > requirements.txt ’
        12
    privil   2018-11-07 11:35:14 +08:00
    https://item.jd.com/12241204.html 这本书的读书笔记么?
        13
    xi2008wang   2018-11-07 11:41:51 +08:00
    顶楼主,瞎 BB 的让他一个人瞎 BB 去
        14
    ltoddy   2018-11-07 11:44:17 +08:00
    @xpresslink 看博客学个毛, 都是看 reference 或者 spec.
        15
    SeaRecluse   2018-11-07 11:53:15 +08:00
    py2 的请自动退群谢谢:D
        16
    whoami9894   2018-11-07 12:02:40 +08:00 via Android
    @xpresslink
    《 Python 核心编程》不就是入门书吗
        17
    xuanyuanaosheng   2018-11-07 12:14:16 +08:00 via Android
    mark
        18
    cxa   2018-11-07 15:41:17 +08:00
    @privil 没错是这本
        19
    cxa   2018-11-07 15:43:17 +08:00
    @111111111111 python 高级编程读书笔记(一)

    python 高级编程读书笔记,记录一下基础和高级用法

    我说的很明白了啊,python 高级编程的读书笔记,记录基础和高级语法。没毛病啊 这本书就是初级加高级。
        20
    cxa   2018-11-07 15:44:26 +08:00
    @ltoddy 你看到了题目 没看到读书笔记的么,下面第一句我就写了 [python 高级编程读书笔记,记录一下基础和高级用法] 请仔细揣摩下再做评论。
        21
    cxa   2018-11-07 15:46:48 +08:00
    @111111111111 谢谢提醒 使用‘ pip freeze > requirements.txt ’
        22
    ltoddy   2018-11-07 15:59:52 +08:00
    @cxa Orz.
        23
    lolizeppelin   2018-11-07 22:52:34 +08:00 via Android
    @SeaRecluse
    你叫 openstack 退群?
        24
    seven777   2018-11-08 10:20:51 +08:00
    @cxa
    P3 不是用 venv 建立虚拟环境吗?还需要找第三方?
        25
    zhoudaiyu   2018-11-18 13:15:12 +08:00
    问一下,流畅的 python 里的东西算高级编程吗?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1001 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 27ms · UTC 22:01 · PVG 06:01 · LAX 14:01 · JFK 17:01
    ♥ Do have faith in what you're doing.