zoukankan      html  css  js  c++  java
  • 第3章 Python基础

    Python语句中有一些基本规则和特殊字符

    · 井号(#)表示之后的字符为Python注释
    · 换行(
    )是标准的行分隔符(通常一个语句一行)
    · 反斜线()是继续上一行
    · 分号(;)将两个语句连接在一行中
    · 冒号(:)将代码块的头和体分开

    2、变量赋值

    2.1 赋值操作符

    Python语言中,等号(=)是主要的赋值操作符(其他的是增量赋值操作符)。

    在Python语言中,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量。

    >>> x = 1
    >>> y = x = x + 1    # 链式赋值
    >>> x, y
    (2, 2)
    

    Python不支持类似x++或--x这样的前置/后置自增/自减运算。

    >>> x = y = z = 1  # 多重赋值
    >>> x, y, z
    (1, 1, 1)
    

    将多个变量同时赋值的方法我们称为多元赋值(multuple)。采用这种方式赋值时,等号两边的对象都是元组。

    >>> x, y, z = 1, 2, 'a string'  # (x, y, z) = (1, 2, 'a string')
    >>> x, y, z
    (1, 2, 'a string')
    >>> x, y = y, x      # 直接交换两个变量的值
    >>> x, y
    (2, 1)

    3、标识符

    3.1 合法的Python标识符

    · 第一个字符必须是字母或下划线(_)
    · 剩下的字符可以是字母和数字或下划线
    · 大小写敏感

     3.2 专用下划线标识符

    Python用下划线作为变量前缀和后缀指定特殊变量。

    · _xxx_ 系统定义名字
    · _xxx 类中的私有变量名

    一般来讲,变量名_xxx被看作是“私有的”,在模块或类外不可以使用。当变量是私有的时候,用_xxx来表示变量是很好的习惯。

    3.3 模块结构和布局

    下面是一种较为合理的模块布局:

    # (1)起始行
    # (2)模块文档
    # (3)模块导入
    # (4)变量定义
    # (5)类定义
    # (6)函数定义
    # (7)主程序
    class Test():
        '''测试类'''
    
        def test01(self):
            '''测试函数'''
            pass
    
    if __name__ == "__main__":
        print(Test().__doc__)           # 获取类的文档信息:测试类
        print(Test().test01.__doc__)    # 获取函数的文档信息:测试函数
        print(Test().test01.__name__)   # 获取函数的方法名:test01
        print(__file__)                 # 获取模块的路径:E:/Temp/test_register.py
    class FooClass():
        pass
    
    if __name__ == "__main__":
        foo = FooClass()
    
    · 如果模块是被导入,__name__的值为模块的名字;
    · 如果模块是被直接执行,__name__的值为'__main__'

    3.5 内存管理

    · 变量无需事先声明;
    · 变量无需指定类型;
    · 不用关心内存管理;
    · 变量名会被“回收”;
    · del语句能够直接释放资源。

    3.5.1 动态类型

    在Python中,对象的类型和内存占用都是运行时确定的。

    在创建——也就是赋值时,解释器会根据语法和右侧的操作数来决定新对象的类型。在对象创建后,一个该对象的应用会被赋值给左侧的变量。

     3.5.2 引用计数器

    Python内部记录着所有使用中的对象各有多少引用。

    一个内部跟踪变量,称为一个引用计数器。每个对象各有多少个引用,简称引用计数。

    当对象被创建时,就创建一个引用计数,当这个对象不再需要时,也就是说,这个对象的引用计数变为0时,它被垃圾回收。

     3.5.3 增加引用计数

    当对象被创建并(将其引用)赋值给变量时,该对象的引用计数就设置为1。

    当同一个对象(的引用)又被赋值给其它变量时,或作为参数传递给函数、方法或类实例时,或者被赋值为一个窗口对象的成员时,

    该对象的一个新的引用,或者称作别名。就被创建(则该对象的引用计数自动加1)。

    如下:

    x = 3.14   # 创建了一个浮点型对象并将其引用赋值给x。x是第一个引用,因此该对象的引用计数被设置为1。
    y = x      # 创建了一个指向同一对象的别名y。并没有为y创建一个新对象。而是该对象的引用计数增加了1(变成了2).

    总之,对象的引用计数增加时:

    · 对象被创建
      x = 3.14
    · 或另外的别名被创建
      y = x
    · 或被作为参数传递给函数
      foobar(x)
    · 或成为容器对象的一个元素
      myList = [123, x, 'xyz']

    3.5.4 减少引用计数

    当对象的引用被销毁时,引用计数会被减少。

    如当引用离开其作用范围时,常出现在函数运行结束时,所有局部变量都被自动销毁,对象的引用计数也就随之减少。

    foo = 'xyz'    # 引用计数是1
    bar = foo      # 增加了别名bar,引用计数变为2
    foo = 123     # foo被重新赋值,xyz对象的引用计数自动减1,重新变成了1

    总之,一个对象的引用计数在以下情况会减少:

    · 一个本地引用离开了其作用范围,比如foobar()函数结束时;
    · 对象的别名被显示销毁;
      del y    # or del x
    · 对象的一个别名被赋值给其他对象;
      x = 123
    · 对象被从一个窗口对象中异常;
      myList.remove(x)
    · 窗口对象本身被销毁;
      del myList    

     del语句

    Del语句会删除对象的一个引用,它的语法如下:

    del obj1[, obj2[, ...objN]]

    例如,在上例中执行del y会产生两个结果:

    · 从现在的名称空间中删除y
    · x的引用计数减1
    
    # 执行del x会删除该对象的最后一个引用,也就是该对象的引用计数会被减为0,导致该对象从此“无法访问”或“无法抵达”,该对象就成为垃圾回收机制的回收对象。

    3.5.5 垃圾收集

    不再使用的内存会被一种称为垃圾收集的机制释放。

    垃圾收集器是一块独立代码,它用来寻找引用计数为0的对象。它也负责检查哪些虽然引用计数大于0但也应该被销毁的对象。

    Python的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。当一个对象的引用计数变为0,解释器会暂停,释放掉这个对象和仅有这个对象可访问的其他对象。

    作为引用计数的补充,垃圾收集器也会留心被分配的总量很大的(以及未通过引用计数销毁的那些)对象。在这种情况下,解释器会暂停下来,试图清理所有未引用的循环。

    import os
    
    while True:
        file = input("请输入文本名:")
        fileName = file + r'.txt'            # 此处的fileName是全局变量
        if os.path.exists(fileName):     # 判断该文件名是否已存在
            print("文件《" + fileName + "》已存在!")
        else:
            break
    
    with open(fileName, 'a') as f:
        while True:
            entry = input(">")
            if entry == 'esc':
                break
            else:
                f.write(entry)
  • 相关阅读:
    easyui validatebox textbox 取值和赋值
    linq中如何在join中指定多个条件
    easyui datagrid 表头固定(垂直滚动条)、列固定(水平滚动条)
    JS Jquery 中 的遍历
    EasyUI datagrid formatter 属性
    基于C#的socket编程的TCP异步实现
    Winform 最小化双击显示,最小化右键退出。退出
    C#中的Invoke
    Socket之listen() receive()
    20210512学习笔记--一直没干啥有用的事儿,最主要还是量变不够,进展过于慢了
  • 原文地址:https://www.cnblogs.com/Maruying/p/15115489.html
Copyright © 2011-2022 走看看