zoukankan      html  css  js  c++  java
  • 模块基础上半部分加 random 模块

    一、模块的四种形式

    1.1 什么是模块

    模块是一系列功能的集合体,而函数是某一个功能的集合体,因此模块可以看成是一堆函数的集合体。一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块。如果这个py文件的文件名为module.py,模块名则是module

    1.2 模块形式:

    1、自定义模块:就是自己创建的py文件,里面写入一堆函数,则这个文件被称为自定义模块,即使用python编写的.py文件。

    2、第三方模块:需要自己安装,有13万个第三方库,无所不能

    3、内置模块:python解释器自带的,不需要安装

    4、包:含有__inti__.py的文件夹,一种特殊的模块(解决了一个问题)

    1.3 为什么要用模块

    1. 用第三方或者内置的模块是一种拿来主义,可以极大地提升开发效率。
    2. 自定义模块,将我们自己程序中用到的公共功能,写入一个python文件,然后程序的各部分组件可以通过导入的方式来引用自定义模块的功能。

    二、import 和 from...import...

    2.1 import 模块名

    python看成一个手机,pip是应用管家,time就是应用管家里的一个应用,要用它就import

    import time
    time.time()
    

    import 首次导入模块发生的3件事情:

    ​ 1、在内存中生成一个叫做time的名称空间

    ​ 2、运行time.py文件,然后把time.py文件内的名称空间放入time的名称空间内

    ​ 3、把time的名称空间指向import和from...import.py(当前导入time模块的文件) 的名称空间中

    模块的重复导入会直接引用之前创造好的加过,不会重复执行模块的文件

    使用import time导入的时候,使用方法只能time.方法名(),不能直接方法名

    2.2 from...import... 模块名

    不推荐使用这个方法

    from time import gmtime
    print(gmtime())
    

    from...import...首次导入模块发生的3件事情:

    ​ 1、在内存中生成一个叫做time的名称空间

    ​ 2、运行time.py文件,然后把time.py文件内的名称空间放入time的名称空间内

    ​ 3、把gmtime方法指向import和from...import.py(当前导入time模块的文件) 的名称空间内,该方法可以不用加任何前缀而直接使用

    • 优点:不用加前缀,代码更加精简
    • 缺点:容易与当前执行文件名中名称空间中的名字冲突

    导入文件内所有内容的功能:

    __all__在两种模块名中的区别

    from test import *   # __all__限制了 from test import *(导入全部)
    from test import f3  # __all__不会限制
    import test          # __all__ 不会限制
    

    2.3 import 和 from...import...的异同

    相同点:

    ​ 1、两者都会执行模块对应的文件,两者都会产生模块的名称空间

    ​ 2、两者调用功能时,需要跑到定义时寻找作用域关系,与调用位置无关

    不同点:

    ​ import 需要加前缀;from...import...不需要加前缀

    三、循环导入问题

    #m1.py
    from m2 import y
    x = 10
    
    #m2.py
    from m1 import x
    y = 20
    

    过程:m1.py --> m2.py --> m1.py ... 就进入了循环导入的死循环

    结果:x/y在这个过程中一直没有生成

    解决方案一 :把导入语句写在最下面一行

    #m1.py
    x = 10
    from m2 import y
    
    
    #m2.py
    y = 20
    from m1 import x
    

    过程:m1.py --> x = 10 --> m2.py --> y = 20 --> m1.py --> x = 10

    结果:x = 10 --> y = 20 --> x = 10

    解决方案二:把导入语句写在函数里面

    #m1.py
    def f1():
        from m2 import y
        print(y)
    x = 10
    
    #m2.py
    def f1():
        from m1 import x
    y = 20 
    

    过程:f1() --> m2.py --> y = 20

    结果:y = 20

    四、模块的搜索路径

    1、先从内存中找

    from m2 import y
    print(y)
    import time
    time.sleep(10)  # 10s内删除了m2
    
    from m2 import y
    print(y)
    

    2、再从内置模块中找

    from time import time
    print(time)
    

    3、然后从自定制模块中找

    ​ 也就是在自己创建的文件模块中找

    4、最后从环境变量中找(未来项目的执行文件一定要弄一个环节变量)

    import sys
    print(sys.path)  # 环境变量,模块就是在某个路径中,需要添加路径,在这里找
    sys.path.append(r'D:上海Python11期视频python11期视频day 16')
    # del sys.path[1]
    print(sys.path)
    
    import testt
    testt.f1()
    

    五、python文件的两种用途

    1、作为模块文件(m1.py中调用m2.py,运行m1.py时,m2.py即为模板文件),模块可以有多个

    2、作为执行文件(当前运行的文件),执行文件只有一个

    3、执行文件和模块文件是相对的

    # m1.py
    
    x = 10
    if __name__ == '__main__':
        print(x)
        
    # m2.py
    
    import m1
    

    当运行m1.py时,即m1.py作为执行文件,此时 name== main,打印x

    当运行m2.py时,即m1.py作为模板文件,此时name== m1,if条件不成立,报错

    if __name__ == '__main__':实际上就是一个if判断,或者是过滤器。可以用main+tab键快速打出来

    六、random 模块

    random 模块的使用方法

    • 掌握

      1、random.random() 随机生成一个0--1之间的小树

      import random
      
      print(random.random())  #随机生成一个大于0小于1之间的小数
      ------------------------------------------------------------
      0.6331352272344526
      

      2、random.randint():随机生成一个数值范围内两头都包括之间的整数

      import random
      
      print(random.randint(1,5))   #随机生成一个大于等于1且小于等于5之间的整数
      
      ------------------------------------------------------------
      5
      

      3、random.shuffle():打乱容器类元素--->列表和字典

      import random
      
      list = [1,3,5,7,9]
      random.shuffle(list)   #打乱list的顺序,相当于“洗牌”
      print(list)
      ------------------------------------------------------------
      [9, 5, 3, 7, 1]
      
    • 了解

      1、random.randrange():随机生成一个给定范围内(顾头不顾尾)的整数

      import random
      #随机生成一个大于等于1且小于3之间的整数
      # print(random.randrange(1,3))
      ------------------------------------------------------------
      1
      

      2、random.uniform():随机生成给定范围内(头尾都不顾)的小数

      import random
      #随机生成一个大于1小于3的小数
      print(random.uniform(1,3))
      ------------------------------------------------------------
      2.7201432742975458
      

      3、random.choice():随机取出列表内的任意一个元素

      import random
      #随机生成列表内的任意一个元素
      print(random.choice([1,'23',[4,5]]))
      ------------------------------------------------------------
      1
      

      4、random.sample():随机取出列表元素任意n个元素的组合

      import random
      #随机生成列表元素任意n个元素的组合
      print(random.sample([1,'23',[4,5]],3)) #这个3就代表n
      ------------------------------------------------------------
      [[4, 5], '23', 1]
      
  • 相关阅读:
    PredictionIO+Universal Recommender快速开发部署推荐引擎的问题总结(1)
    SpringJDBC的JdbcTemplate在MySQL5.7下不支持子查询的问题
    POP3接收邮件
    发送邮件
    电子邮件介绍
    线程优先级队列
    线程同步
    threading模块
    _thread模块
    使用线程
  • 原文地址:https://www.cnblogs.com/zhuangyl23/p/11360897.html
Copyright © 2011-2022 走看看