Python核心编程-第三章

3.1 语句和语法

    3.1.1 注释(#)

注释句从 # 开始,到此行结束。当然还有三引号那种长注释,如下

'''里面全是注释,可以是段落'''

   3.1.2 继续(\)

这个是反斜杠,一直搞不明白反斜杠跟斜杠,这个记住吧。

如果一行代码太长,就用这个反斜杠

if (weather_is_hot == 1) and \
(shark_warnings == 0):
    send_goto_beach_mesg_to_pager()

当然,也有例外:

1.闭合操作符内可以不用,如小括号、中括号、大括号内可以多行书写

a = ['apple','banana',
'watermelon'
]

2.三个引号内的字符串

print '''Today is saturday,
it is a sunny day.
May I have a nice tomorrow.'''

    3.1.3 多个语句构成代码组(:)

缩进相同的语句构成代码块,我们叫做代码组。

if,while,def,class这些关键字开头,并且夹带着其后面的代码组我们称之为

子句(clause)

    3.1.4 代码组由不同的缩进分割

核心风格:缩进4个空格,避免只用制表符。

这个深有体会,当我从notepad里面复制代码到此页面的python框中时,就会发现缩进比较混乱。还要重新编辑空格

    3.1.5 同一行书写多个语句(;)

import sys; x = 'foo'; sys.stdout.write(x + '\n')

用 ; 可以把不同行的语句放在同一行,只是这样的话可读性变差,不建议使用。

    3.16 模块

这小结内没有什么可说的,模块以磁盘文件的形式存在,每个Python脚本文件都可以看作是一个模块。


3.2 变量赋值    

    3.2.1 赋值操作符

等号 = 是主要的赋值操作符

anInt = -12
aString = 'cart'
aFloat = -3.1415 * (5.0 ** 2)
anotherString = 'shop' + 'ping'
aList = [3.14e10, '2nd elmt of a list', 8.82-4.371j]

这里看似简单,其实更深层次有些意思

赋值不是把数值或者字符串的直接给变量,而是将对象的引用(不是对象的值)赋值给变量。注意是引用!

赋值还有一些写法:

>>>x = 1
>>>y = x = x + 1
>>>x,y
(2,2)

    问:为啥会有小括号?

3.2.2 增量赋值

>>>x = 2
>>>x += 1               #相当于x = x + 1
>>>x
3

同理还有 

+=  -=  *=  /=  %=  **= , <<=  >>=  &=  ^=  |=  (后面这5个应该是位操作)

还有这些操作:

>>> aList = [123, 'xyz']
>>> aList += [45.6e7]
>>> aList
[123, 'xyz', 456000000.0]


    3.2.3 多重赋值

就是为了懒省事,做出了这些操作

>>> x = y = z = 1
>>> x
1
>>> y
1
>>> z
1


    3.2.4 “多元”赋值

为了省事,这都行

>>>a,b,c = x,y,z        #这不是省事这是什么,哈哈
>>>a,b,c
(1,1,1)
>>>x,y = 1,2
>>>x,y
(1,2)                    
>>>x,y = y,x
>>>y,x
(2,1)

3.3 标识符

定义:是计算机语言中允许作为名字的有效字符串集合。有些关键字比方def、and、for等等,这些事保留字,不做其他用途

    3.3.1 合法的Python标识符

合法的:

  • 第一个字符必须是字母或者下划线

  • 剩下的字符可以是字母下划线或者数字

  • 区分大小写

    3.3.2 关键字

这个不多赘述

    3.3.3 内建

Python有内建名字的集合,这些名字由解释器设置或者使用。

其他过多的了解也没啥用

    3.3.4 专用下划线标识符

核心风格:避免用下划线作为变量名的开始。

因为变量名_xxx 被看作是“私有的”,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。变量名__xxx__对Python 来说有特殊含义。

  • _xxx 不用'from module import *'导入

  • __xxx__系统定义名字

  • _xxx 类中的私有变量名

3.4 基本风格指南

注释   文档(通过xx.__doc__访问)  缩进   标识符名称做了一些规范

3.4.1 模块结构和布局

觉得这个一节讲的很好,或者说收获颇大,因为这个毕竟是以后编码的规范啊~~

#/usr/bin/env python            #1).起始行

"this is a test module"        #2).模块文档(文档字符串)

import sys                     #3).模块导入
import os

debug = True                  #4).(全局)变量定义

class FooClass(object):       #5).类定义(若有)
    "Foo class"
    pass
    
def test():                  #6).函数定义(若有)
    "test function"
    foo = FooClass()
    if debug:
        pring 'Ran test()'
        
if __name__ = "__main__":    #7).主程序
    test()

1).仅在类Unix环境下才使用起始行

2).介绍模块功能和全局变量的含义

3).~7).简略啦

核心风格:主程序调用main()函数

主程序中的代码通常包括变量赋值、类定义和函数定义。

核心笔记:__name__只是模块应如何被加载

由于主程序代码无论模块是被导入还是被直接执行都会运行, 我们必须知道模块如何决定运行方向。一个应用程序可能需要导入另一个应用程序的一个模块,以便重用一些有用的代码(否则就只能用拷贝粘贴那种非面向对象的愚蠢手段)。 这种情况下,你只想访问那些位于其它应用程序中的代码,而不是想运行那个应用程序。因此一个问ti出现了,“Python 是否有一种方法能在运行时检测该模块是被导入还是被直接执行呢?” 答案就是......(鼓声雷动).....没错! __name__ 系统变量就是正确答案。

  • 如果模块是被导入, __name__ 的值为模块名字

  • 如果模块是被直接执行, __name__ 的值为 '__main__'

上面几行是copy过来的,这里加上自己查资料后的理解:

首先,一个模块就是一个对象,而__name__这个变量是这个模块(应该是所有模块都有)的属性。

如果在另外一个文件中import这个模块,这个__name__的值是此模块名;但当直接在powershell运行这个模块的时候(把它当作了执行文件),

变量__name__的值就变成了“__main__”(其实main本身是缺省的)。

用例子说明一下,毕竟我记性不大好,拐回来可能又忘了。

假设这个模块文件名是test.py

class Test:
    def __init(self):pass
    def f(self):print 'Hello, World!'
if __name__ == '__main__':
    Test().f()

在powershell中运行

>python test.py
Hello,World!

这种情况,__name__的值是__main__

但如果是这样(交互模式):

>>>import test
>>>test.__name__
'test'

看到没,这个时候__name__是test,也就是它的模块名,或者说是文件名都行。那'__main__'到哪里去了呢?接着上面

>>>__name__
'__main__'

原来,这个__main__是当前程序的__name__值

3.5 内存管理

    3.5.1 变量定义

变量在第一次被赋值时自动声明,没什么过多可以讲的

    3.5.2 动态类型

>>>a = 1
>>>a = 'hello'

也就是说,这个类型Python会自己判断,无需声明

    3.5.3 内存分配

变量需要分配内存,在不用变量之后要释放内存。但在Python中,这个由解释器来完成,你不用操心

    3.5.4 引用计数

   python内部记录所有对象的引用次数,这些引用次数叫做引用计数

引用计数的增加:

  • 对象被创建    x = 4

  • 被另外的别名创建    y = x

  • 作为参数传递给函数    foobar(x)

  • 成为容器对象的一个元素        mylist = [123, x, 'xyz'] 

引用计数的减少:

  • 一个本地引用离开了其作用范围。比如 foobar()函数结束时。

  • 对象的别名被显式的销毁。        del y

  • 对象的一个别名被赋值给其它的对象        x = 123        #本来对象1的别名是x,然后123横刀夺爱,所以对象1的引用计数减一

  • 对象被从一个窗口对象中移除        myList.remove(x)

  • 窗口对象本身被销毁            del mylist

注意,引用计数是针对对象的,只有对象的引用计数增加或者减少

del语句:

del y会产生两种结果

>>>x = 3.14
>>>y = x
>>>del y
  • 从现在的名称空间删除y

  • x的引用计数减一

    3.5.5 垃圾收集

接上步,如果

del x,则x的引用计数变为0,垃圾收集器(一个独立代码)会释放其内存

垃圾收集器包括:引用计数器和循环垃圾收集器

这个循环垃圾收集器用来处理两个对象相互引用的情况(目前我没有碰到过),这种情况的发生是因为引用计数器发现不了相互引用的情况,所以有循环回收

3.6 第一个Python程序

#!/usr/bin/env python

'makeTextFile.py -- create text file'

import os
ls = os.linesep

# get filename
while True:
    fname = raw_input("please enter the filename:")        #少这一行,勘误啊这是
    if os.path.exists(fname):
	print "ERROR: '%s' already exists" % fname
    else:
	break

# get file content (text) lines
all = []
print "\nEnter lines ('.' by itself to quit).\n"

# loop until user terminates input
while True:
    entry = raw_input('> ')
    if entry == '.':
	break
    else:
	all.append(entry)

# write lines to file with proper line-ending
fobj = open(fname, 'w')
fobj.writelines(['%s%s' % (x, ls) for x in all])
fobj.close()
print 'DONE!'

我发现了一个大坑!!!,这买的中文版第二版的教材这段代码居然少一行,而且这个代码块没有缩进,擦擦擦浪费青春啊有木有

不过运行没有问ti了:

please enter the filename:abc

Enter lines ('.' by itself to quit).

>I love three things
>the sun,the moon and you
>I love the sun for day,the moon for night
>and you forever
>.

核心提示:使用局部变量替换模块变量

比方第6行,os.linesep(行结束符)解释器需要做两次查询:1)查找os确认它是个模块;2)在这个模块中查找linesep变量

这样os.linesep出现的次数多会消耗系统资源,所以有了ls = os.linesep。把这个常用的属性替换一个本地应用。高,实在是高!

3.7 相关模块和开发工具

没有什么过多需要说的




你可能感兴趣的:(第三章,python核心编程)