从头啃《python核心编程(第二版)》 第3章

版权声明:文章粗陋,仅供参考 https://blog.csdn.net/TallGiraffe_/article/details/79962959

第3章 python基础

特殊语法

  • \ 断行,一行写不开的代码可以在下一行继续写
    闭合操作符本身也支持断行,(),[],{}另外三引号字符串也支持断行
  • ; 两个语句可以卸载同一行,尽管Python支持但这么写没什么好处

变量和赋值

python中对象通过引用传递,赋值是无论对象是已存在的还是新建的都是将对象的引用赋值给变量

赋值语句没有返回值

python中赋值语句没有返回值(C语言赋值有返回值)
print a = 1 # 会引发SyntaxError

链式赋值

python支持链式赋值
x = 1
x = y = x + 1
print x,y
2 2

增量赋值

python支持增量赋值 += -= *= /= **=
x = 0
x += 1
增量赋值时,左边的最想仅被处理一次,可变对象就地被修改,不可变对象和x = x + 1一样,创建新对象并把引用赋值给原来的变量

多元赋值

x, y , z = 1, 2, 'string'
print x, y, z
1 2 string

# 等同于
# (x, y, z) = (1, 2, 'string')
之所以叫多元赋值,是因为赋值两边其实都是元组,只是省略了小括号 **交换两个变量值**
x, y = 1, 2
print x, y
1 2
x, y = y, x
print x, y
2 1

# 将y存储的对象2的引用赋值给x
# 将x存储的对象1的引用赋值给y
# 对象的引用交换了,x, y打印的对象值自然就交换了

python标识符

  1. 字母或下划线开头
  2. 由数字字母下划线组成
  3. 大小写敏感

关键字

keyword模块提供iskeyword()方法,查询字符串是不是关键字 kwlist提供了当前版本的系统关键字

内建字

python在任何一级代码中都能使用的内建名字集合由解释器设置和使用 built-in 是__builtins__模块成员,程序运行时由解释器自动引入

下划线指定特殊变量

  • _xxx # 不用from x import *引入的
  • __xxx__ # 系统定义的名字
  • __xxx # 类中的私有变量

编程风格

文档字符串
obj.doc动态获得文档字符串,obj可以是模块、类、函数

模块结构

  1. 起始行unix魔术字符串 # /usr/bin/env python指定解释器,用于unix系统双击就可执行
  2. 模块文档字符串
  3. 模块导入 # 每个模块仅被导入一次(当前模块被加载时)
  4. 变量定义 # 全局变量
  5. 类定义 # 模块被导入时class语句会被执行,类就会被定义
  6. 函数定义 # 函数,这里定义的函数可以module.funciton()方式使用,模块被导入时def语句执行函数被定义(注意这里是函数,不是类里面的方法)
  7. 主程序
#/usr/bin/env python

"this is a test module"

import sys
import os

debug = True

class FooClass(object):
    "Foo class"
    pass

def test():
    "test function"
    foo = FooClass()
    if debug:
        print "run test()"

if __name__ == '__main__':
    test()

没有缩进的顶级代码行在模块被导入时就会被执行

通常应该只有主程序有大量顶级代码行,那些主要用于引入的模块应该只有很少的顶级执行代码,所有功能代码都应该封装在函数和类中

指示模块如何被加载

模块的name属性可以显示模块如何被加载
1. 当模块是被引入时,name的值是模块的名字
2. 当模块被直接执行时,__name__的值是’__main__”

变量定义

变量只有被创建和赋值后才能被使用

python无需显示声明语句,变量在第一次赋值时自动声明

变量名和类型都无需声明,在创建-也就是赋值时解释器根据语法和右侧操作数决定新对象的类型,对象创建后,一个该对象的引用被赋值给左侧变量

引用计数

一个python内部跟踪变量叫做引用计数,对象的引用计数为0时,对象被销毁释放内存(不100%正确,暂且这么理解)

引用计数增加的情况

  1. 对象被创建 # x = 1
  2. 另外的别名被创建 # y = x ,对象的引用
  3. 作为参数传递给函数 # foobar(x)
  4. 成为容器对象的一个元素 # myList = [1, x, ‘list’]

引用计数减少的情况

  1. 一个本地引用离开了其作用范围 # foobar()函数运行结束时
  2. 对象的别名被显示的销毁 # del x
  3. 对象的一个别名赋值了其他对象 # x = 123
  4. 对象被从一个容器(书上写窗口)对象中移除 # myList.remove(x)
  5. 窗口对象本身被销毁 # del myList

垃圾收集

不再被使用的内存被一种叫垃圾收集的机制释放

解释器跟踪对象的引用计数,垃圾收集器负责释放内存

垃圾收集器是一块独立代码,引用计数为0,和引用计数大于0但也应该被销毁的对象(两个对象相互引用导致的循环引用)

python的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器

os.linesep行结束符

win32平台的行结束符\r\n

unix平台是\n

os.linesep可以肯定系统类型自动选择

核心技巧

import os

ls = os.linesep

利用局部变量代替os.linesep有助于提高性能,因为使用os.linesep时,系统要先查找os确保它是一个模块,再在此模块中查找linesep属性

模块属于全局变量,而在查找全局变量前总是先查询局部变量

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页