Python中的小魔法(二)

01

函数

局部变量

x = 66

def func(x):
    print('x等于', x)
    x = 6
    print('局部变量x改变为', x)

func(x)
print('x一直是', x)

结果

x等于66
局部变量x改变为6
x一直是66

使用全局声明

x = 66

def func():
    global x

    print('x的值是', x)
    x = 6
    print('全局变量x改为', x)

func()
print('x的值是', x)

结果

x的值是66
全局变量to改为6
x的值是6

02

模块

字节编译的.pyc文件

导入一个模块是一个相对昂贵的事情,所以Python做了一些技巧使它更快。一种方法是创建扩展名为.pyc的字节编译文件,是Python将程序转换成的一种中间形式。

pyc是由py文件经过编译后二进制文件,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由Python的虚拟机来执行的。

注意:这些.pyc文件通常在与之相应的.py文件的同一个目录中创建。如果Python在那个目录中没有写入权限,那么.pyc文件将不会创建。

from ... import语句

常见的就是

from urllib import request

from bs4 import BeautifulSoup

from lxml import etree

一般来说,你应该避免使用这个语句,而应该使用import语句,因为你的程序将避免名称冲突,将更具可读性。

第一个模块

例子 (保存为 test.py):

def demo():
    print('哈哈,这是我写的一个模块~')

__version__ = '3.1'

在该目录下新建文件

import test

test.demo()
print('版本',test.__version__)

结果

哈哈,这是我写的一个模块~
版本 3.1

Python充分重用相同的符号产生了独特的'Pythonic'的感觉,这样我们不需要不断学习新的方法来做事情。

也可以使用from ... import语法

from test import demo,__version__

demo()
print('版本',__version__)

dir函数

>>> import urllib
>>> dir(urllib)  # 获得属性列表

['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__',
 '__path__', '__spec__', 'error', 'parse', 'request', 'response']
>>> dir()  # 获得当前模块的属性列表
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'requests', 'urllib']
>>> a = 1
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'requests', 'urllib']
>>> del a
>>> dir()
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'requests', 'urllib']

注意,dir()函数对任何对象都起作用。例如,运行dir('str')来学习str(string)类型的更多知识。

打包(Packages)

现在,你必须开始观察组织你的程序的层次结构。变量通常在函数内部。函数和全局变量通常在模块内部。如果你想组织模块?这就到了牵涉到打包的地方了。

包只是模块的文件夹,使用一个特殊的__init__.py文件,指示Python,这个文件夹是特殊的,因为它包含Python模块。

假设你想创建一个叫做'世界'的程序包,分装'亚洲'、'非洲'等等,分包按序包含'印度'、'马达加斯加'等等。

这是你的文件结构:

- <在sys.path中现有的一些文件夹>/
    - world/
        - __init__.py
        - asia/
            - __init__.py
            - india/
                - __init__.py
                - foo.py
        - africa/
            - __init__.py
            - madagascar/
                - __init__.py
                - bar.py

原文发布于微信公众号 - Python爬虫与算法进阶(zhangslob)

原文发表时间:2017-08-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏非著名程序员

你真的会用Android中Strings资源吗

Android为了帮助开发者把应用更方便发布给全球不同语言的人们使用,建议开发者在进行开发时不要把UI呈现相关的文本内容硬编码,而是把内容写入到strings....

26190
来自专栏后端技术探索

利用 PHP 名称空间编写可读且可维护的代码

“Conan 是我榜样。” 如果我在餐桌上说这句话,我儿子会以为我说的是游戏 “野蛮人柯南”,而我妻子会以为我说的是脱口秀主持人 Conan O'Brien。这...

13720
来自专栏性能与架构

ES6 新特性示例

JS的新版本 ES6/ECMAScript2015 在去年出来了,我们现在普遍使用的ES5是在2009年出来的,相隔这么多年,变化比较大,添加了一些很好用的特性...

29660
来自专栏企鹅号快讯

培养这10个习惯,你就离UNIX高手更进一步了

来自:IBM developerWorks 链接:https://www.ibm.com/developerworks/cn/aix/library/au-un...

20960
来自专栏决胜机器学习

RabbitMQ(五) ——话题模式

RabbitMQ(五)——话题模式 (原创内容,转载请注明来源,谢谢) 一、概述 话题模式(topic)可以让队列绑定某一类型的消息,而不仅仅是direct模式...

35150
来自专栏编程之旅

2.24

oc中的内存管理机制:使用一种叫做引用计数的机制来管理内存中的对象。OC中每个对象都对应着他的引用计数,引用计数可以理解为一个整数计数器,当使用alloc方法创...

13130
来自专栏Coco的专栏

【基础进阶】URL详解与URL编码

20590
来自专栏蓝天

细节决定品质:不良的if/else使用习惯

这个时候应当考虑提取成函数调用,以减少直接的if/else嵌套层次。同理,while/for也应当避免这种情况。

9810
来自专栏Vamei实验室

Linux并发与同步

典型的UNIX系统都支持一个进程创建多个线程(thread)。在Linux进程基础中提到,Linux以进程为单位组织操作,Linux中的线程也都基于进程。尽管实...

29190
来自专栏java一日一条

Java 类加载机制详解

Java 虚拟机一般使用 Java 类的流程为:首先将开发者编写的 Java 源代码(.java文件)编译成 Java 字节码(.class文件),然后类加载器...

12210

扫码关注云+社区

领取腾讯云代金券