python基础学习(十二)
模块
前面有简单介绍如何使用import从外部模块获取函数并且为自己的程序所用:
>>> import math
>>> math.sin(0) #sin为正弦函数
0.0
模块是程序
任何python程序都可以作为模块导入。假设写如下程序,并且将它保存为以C:\python\hello.py
#hello.py
print "hello,world!"
下面通过python解释器调用:
>>> import sys
>>> sys.path.append('c:/python')
>>> import hello
hello,world!
再来一次:
>>> import hello >>>
怎么这次没结果?因为导入模块并不意味着在导入进执行某些操作。它们主要用于定义,比如变量、函数和类等。此外,因为只需要定义这些东西一次,导入模块多次和导入一次的效果是一样的。
模块用于定义
1、在模块中定义函数
假设我们编写了一个类似代码的模块,将其保存为hello2.py 文件。
#hello2.py
def hello():
print "hello, world !"
保存后,可以像下面这样导入:
>>> import hello2
模块会被执行,这意味着hello函数在模块的作用被定义了。因此可以通过以下方式来访问函数:
>>> hello2.hello()
hello.world!
2、在模块中增加测试代码
模块用来定义函数、类和其他内容,有时候在模块中添加一些检查模块本身是否正常工作的测试代码是非常有用的。

#hello3.py def hello():
print "hello.world!" def test():
hello() if __name__ == '__main__': test()

f __name__ == '__nain__' 解释:
python文件的后缀为.py ,.py文件可以用来直接运行,就像一个独立的小程序;也可以用来作为模块被其它程序调用。
__name__是模块的内置属性,如果等于'__main__' 侧表示直接被使用,那么将执行方法test()方法;如果是被调用则不执行 if 判断后面的test()方法。
执行结果:

>>> import hello3 #表示hello3模块被调用,不执行test方法,所以没有输出 >>> hello3.hello() #表示程序执行,调用test方法 hello.world! >>> hello3.hello() #这里是不是可以反复调用test方法 hello.world!

让模块可用
前面的例子中,我们改变了sys.path,其中包含了一个目录列表,解释器在该列表中查找模块。在理想情况下,一开始sys.path本身就应该包含正确的目录,有两方法可以做到这一点: 一是将模块放置在合适的位置,别外一种是告诉解释器去哪里查找需要的模块。
1、将模块放置在正确的位置
来看看python解释器会从哪里查找模块

>>> import sys,pprint
>>> pprint.pprint(sys.path)
['',
'I:\\Python27\\Lib\\idlelib',
'C:\\Windows\\system32\\python27.zip',
'I:\\Python27\\DLLs',
'I:\\Python27\\lib',
'I:\\Python27\\lib\\plat-win',
'I:\\Python27\\lib\\lib-tk',
'I:\\Python27',
'I:\\Python27\\lib\\site-packages',
'c:/python']

尽管这些目录下都可以被找到,但site-packages 目录是最佳选择。
2、告诉编译器去哪里找
以下情况是告诉编译器去哪儿找的原因:
** 不希望将自己的模块填满python解释器的目录
** 没有在python解释器目录中存储文件的权限
** 想将模块放到其它位置
编辑sys.path ,前面就已经使用了
>>> import sys
>>> sys.path.append('c:/python')
但更优雅的做法是配置pythonpath环境变量,方法和配置java 环境变量类似。
文档
模块信息的自然来源是文档,除了通过python书籍或标准python文档来查看某个函数的含义,也可以通过下面方式:

>>> print range.__doc__
range([start,] stop[, step]) -> list of integers Return a list containing an arithmetic progression of integers.
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
When step is given, it specifies the increment (or decrement).
For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!
These are exactly the valid indices for a list of 4 elements.

这样就获得了关于range函数的精确描述。
time 模块
time模块所包括的函数能够实现 以下功能:获得当前时间,操作时间和日期,从字符串读取时间以及格式化时间为字符串。
time模块中重要的函数

time.asctime将当前时间格式化为字符串:
>>> time.asctime()
'Thu May 16 00:00:08 2013'
random模块
random模块包括返回随机的函数,可以用于模拟或者用于任何产生随机输出的程序。
random模块中的一些重要函数:

下面介绍使用random模块的例子,还需要用到time模块中的函数。
例1:首先获得代表时间间隔(2013年)限制的实数,这可以通过时间元组的方式来表示日期(使用 -1表示一周的某天,一年中某天和夏令时,以例让python自己计算),并且对这些元组调用mktime :

from random import *
from time import *
data1 = (2013 ,1,1,0,0,0,-1,-1,-1)
time1 = mktime(data1)
data2 = (2014 ,1,1,0,0,0,-1,-1,-1)
time2 = mktime(data2) #然后在这个范围内生成随机数
>>> random_time = uniform(time1,time2)
# 可以将数字转换成易读的日期形式
>>> print asctime(localtime(random_time))
Fri Jan 18 18:23:16 2013

例2:下面一个例子,假设三个人打牌,首先要保证54张牌没有重复的,第人发手里18张(斗地主就不能平均分配了)。

>>> values = range(1,13) + 'dwang xwang'.split() #定义13个数字与大小王
>>> suits = 'hei hong mei fang '.split() # 定义牌的四种类型(黑、红、梅、方)
>>> deck = ['%s of %s' %(v ,s ) for v in values for s in suits] #循环嵌套将其循环组合
>>> from pprint import pprint #调用pprint 模块
>>> pprint (deck [:18]) #输出18张牌
['1 of hei',
'1 of hong',
'1 of mei',
'1 of fang',
'2 of hei',
'2 of hong',
'2 of mei',
'2 of fang',
'3 of hei',
'3 of hong',
'3 of mei',
'3 of fang',
'4 of hei',
'4 of hong',
'4 of mei',
'4 of fang',
'5 of hei',
'5 of hong'] #显然上面的输出太整齐,调用随机函数,随机一点
>>> from random import shuffle
>>> shuffle(deck)
>>> pprint(deck[:18])
['5 of fang',
'6 of hong',
'5 of mei',
'dwang of fang',
'xwang of fang',
'10 of hong',
'7 of mei',
'12 of hong',
'6 of hei',
'12 of hei',
'7 of hei',
'8 of hei',
'4 of fang',
'dwang of hei',
'11 of hei',
'12 of fang',
'5 of hei',
'2 of hong']

不过,依然是有问题的,大小王不应该分类型(黑、红、梅、方),显然上面的结果不够完美。
python基础学习(十二)的更多相关文章
- Python基础学习(二)
前一段时间学习了Python数据类型,语句和函数,目前书写python的新特性,继续练手!!!! 一.切片 之前我们从python的list 或者 tuple中取得元素都是这样写,显然不够灵活 lis ...
- python基础学习十 logging模块详细使用【转载】
很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,主要用于输出 ...
- Py修行路 python基础 (十二) 协程函数应用 列表生成式 生成器表达式
一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._next_() 取下一个值 优点: 1.提供了 ...
- Python基础(十二)
今日主要内容 推导式 生成器表达式 lambda匿名函数 内置函数介绍 一.推导式 (一)列表推导式 先来看一段代码 建立一个空列表,向空列表中添加元素 lst = list() for i in r ...
- Python基础学习总结(二)
2.列表简介 Python有内置的一种数据类型列表:list. list是一种有序的集合. 列表由一系列按特定顺序排列的元素组合.用方括号 [ ] 来表示. list里面的元素的数据类型可以不同,比如 ...
- python基础学习(二)--函数
return返回值: python函数都有返回值,函数体内无return,默认返回值None, 函数参数: 1.普通参数 严格按照顺序,将实际参数赋值给形式参数,一一对应. 例: def send(x ...
- python基础学习笔记二之列表
1.列表 ①列表的创建: ②列表的查询(索引): ③列表的切片操作: 此处要注意到:返回索引0到3的元素,顾头不顾尾. ④列表的增加: s.append() #直接在结尾追加 s.insert() ...
- Python基础学习篇章二
一. Python如何运行程序 1. 在交互模式下编写代码 最简单的运行Python程序的方法是在Python交互命令行中输入程序.当然有很多方法可以开始这样的命令行,比如IDE,系统终端.如果你已经 ...
- python基础学习(二)注释和算术运算符
注释 1. 注释的作用 注释就是对某些代码进行标注说明,以增强代码的可读性.我们在写程序的时候,编写的某一部分代码的意图不太明显,这时候就需要对这一部分代码加以说明,来明确这一部分到的意图.一般的编程 ...
- python基础-第十二篇-12.1jQuery基础与实例
一.查找元素 1.选择器 基本选择器 $("*") $("#id") $(".class") $("element") ...
随机推荐
- (转)log4j(五)——如何控制不同目的地的日志输出?
一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 1 老规矩,先来个栗子,然后再聊聊感受 package test.log4j.test5; /** * @author l ...
- 实验楼 1. k-近邻算法实现手写数字识别系统--《机器学习实战 》
首先看看一些关键词:K-NN算法,训练集,测试集,特征(空间),标签 举实验楼中的样例,通俗的讲讲K-NN算法:电影有两个分类(标签)-动作片-爱情片.两个特征--打斗场面--亲吻画面. 将那些数字和 ...
- 定时器(setTimeout)的秘密
原文地址:→传送门 写在前面 setTimeout()是大家再熟悉不过的定时器,但平时对定时器的了解甚少,于是想看看setTimeout()的原理机制. setTimeout()基础 setTimeo ...
- angularJS的$http.post请求,.net后台接收不到参数值的解决方案
JS通用部分 var shoppingCartModule =angular.module('starter', ['ionic'], function ($httpProvider) { // Us ...
- session的用法
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- java利用接口和适配器进行完全解耦--参考《thinking in java》
一.当使用父子类来实现以下东西时,其实是用了向上转型,这段代码的确简单了很多,复用性也很好,但是我们会发现Apply.process()和Processor类耦合过紧,其实apply.process( ...
- Stacked Regression的详细步骤和使用注意事项
声明:这篇博文是我基于一篇网络文章翻译的,并结合了自己应用中的一些心得,如果有侵权,请联系本人删除. 最近做推荐的时候,开始接触到Stacking方法,在周志华老师的西瓜书中,Stacking方法是在 ...
- RabbitMQ入门-Routing直连模式
Hello World模式,告诉我们如何一对一发送和接收消息: Work模式,告诉我们如何多管齐下高效的消费消息: Publish/Subscribe模式,告诉我们如何广播消息 那么有没有灵活强一点的 ...
- 正则表达式大全 --【Python举例】
包含 : 纯文字.正负数,小数.正数.正整数.月份.天数.用户名.密码.车牌.传真.手机.邮件.ipv4私有地址.ipv4地址.ipv6地址.json_header.request_header 有 ...
- mybatis 详解(七)------一对一、一对多、多对多
前面几篇博客我们用mybatis能对单表进行增删改查操作了,也能用动态SQL书写比较复杂的sql语句.但是在实际开发中,我们做项目不可能只是单表操作,往往会涉及到多张表之间的关联操作.那么我们如何用 ...