本章介绍基本的Python语法、编程风格;并简要介绍标识符、变量和关键字,以及变量占用内存的分配和回收;最后给出一个较大的Python样例程序来体验这些特性。

1 语句和语法

1.1 注释

  可以在一行的任何位置,以 # 开头,直至行尾都是注释。

1.2 反斜线继续上一行

  一行过长的语句,可以用反斜线 \ 分解成几行。\ 必须是该行的最后一个字符(其后不能有空格等其他任何字符)。

  闭合符号:小括号()、中括号[]、花括号{}、三引号"""  """/'''  ''',其内的语句可以跨行书写,不需使用 \ 。

1.3 多个语句构成代码组

  缩进相同的一组语句构成一个代码块,称为代码组。例如:if、while等关键字开头的首行,之后的一行或多行就是一个代码组。首行及之后的代码组称为一个子句(clause)。

1.4 代码组由不同的缩进分隔

  代码的层次关系通过同样深度的空格或制表符缩进来体现,同一代码组的代码行必须严格左对齐。

  没有缩进的代码块是最高层次的,称为脚本的main部分。

1.5 同一行书写多个语句

  多个语句写在同一行的话,之间用分号(;)隔开,这些语句同属一个代码块(子句),中间不能开始新的代码块。

1.6 模块

  每个Python脚本文件都可以当成一个模块,模块以磁盘文件形式存在。如果一个模块太大,功能太多,应考虑拆分到多个模块中。

2 变量赋值

  Python通过等号=、增量赋值运算符+=(-=、*=等)来赋值。

  Python中,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量。(要有对象的概念,名字只是一个符号/指针,指向被赋值的对象)

  Python中的链式赋值(多重赋值),只是对象的同一个引用被赋给了多个变量。Python的赋值语句不会返回值(与C不同)。

>>> x = y = z = 1
>>> x
1
>>> y
1
>>> z
1
>>> x = ( y = 13 )File "<stdin>", line 1x = ( y = 13 )^
SyntaxError: invalid syntax

  增量赋值,同样适合与列表/字符串;++n、--n被解析为+(+n)、-(-n),n++、n--是语法错误。

+=    -=   *=   /=   %=   **=  #Python支持的增量赋值符
<<=   >>=   &=   ^=   |=

>>> aList = [123, 'xyz']
>>> aList += [45.6e7]  #列表加
>>> aList
[123, 'xyz', 456000000.0]>>> n=3
>>> --n  #与C语言不同
3
>>> n
3
>>> n--  #语法错误File "<stdin>", line 1n--^
SyntaxError: invalid syntax

  多元赋值,即同时给多个变量赋值:

>>> x, y, z = 1, 2, 'a string'  #等号两边实质是元组,建议总是加上括号,即  (x, y, z) = (1, 2, 'string')
>>> x
1
>>> y
2
>>> z
'a string'
>>> x, y = 1, 2
>>> x
1
>>> y
2
>>> x, y = y, x  #不需要中间变量,即可交换两个变量值
>>> x
2
>>> y
1 

3 标识符

  合法标识符:同C语言,字母或下划线_开头,后面可以是字母、数字或下划线;大小写敏感。

  关键字:关键字列表kwlist和iskeyword()函数都放入了keyword模块以便查阅。

and

as assert break
class continue def del
elif else except exec
finally for from global
if import in is
lambda not or pass
print raise return try
while with yield None
>>> import keyword
>>> keyword.iskeyword('and')
True

  内建:除了关键字之外,Python还有可以在任何一级代码使用的“内建”的名字集合,这些名字可以由解释器设置或使用,应该把它当作“系统保留字”,不做他用。Python不支持重载标识符,任何时刻都只有一个名字绑定。内建built-in是__builtins__模块的成员,在程序开始或在交互解释器中给出>>>提示之前,由解释器自动导入的。把它们看成适用在任何一级Python代码的全局变量。

  类变量的专用下划线标识符:

_xxx      #不用'from module import *'导入,外部可以访问,但是应视其为 私有变量
__xxx__   #系统定义名字,特殊变量,可以直接访问,自己不要使用这种变量名
__xxx     #类中的私有变量名,外部无法访问(实质上,一般的编译器,都将其改名为 _所属类名__xxx)

4 基本风格指南

  添加注释,写字串文档,采用合适缩进,尽量使用简短的变量名。  

import this  #可以看到Python之禅

4.1 模块结构和布局

  编写脚本文件pytest.py,并执行:

#/usr/bin/env python        #1.起始行(Unix) / 模块注释
# -*- coding: utf-8 -*-     #如果代码包含中文,需要添加该行(由于出现在该注释之前,上一行的中文注释会被报错)"this is a test module"     #2.模块文档,可通过 模块名.__doc__ 直接访问import sys    #3.导入所需的模块
import osdebug = True    #4.全局变量。尽量少使用全局变量,有利于代码维护,提高性能,节省内存class FooClass(object):    #5.类定义,模块被导入时类就会被定义"Foo class"            #类文档,可通过 模块名.类名.__doc__ 来访问passdef test():            #6.函数定义,模块被导入时类就会被定义,可通过 模块名.函数名() 来访问"test function"    #函数文档,可通过 模块名.函数名.__doc__ 来访问foo = FooClass()   #类对象if debug:print 'ran test()'if __name__ == '__main__':    #7.主程序部分,通常只包含函数调用,无论是被导入还是作为脚本执行,都会执行这部分代码test()                    #如果模块直接执行,则__name__值为'__main__',该句执行;如果被导入,则__name__值为模块名

$ python pytest.py    #作为脚本直接执行
ran test()>>> import pytest    #交互解释器中,导入模块,主程序部分的if条件不成立。模块名即去掉后缀的文件名
>>> pytest.__doc__  #模块文档
'this is a test module'
>>> pytest.FooClass.__doc__    #模块内的类文档
'Foo class'
>>> pytest.test()    #执行模块内函数
ran test()

  没有缩进的代码,在模块被导入时就会被执行(所以导入模块时,类、函数就会被定义),所以安全的写代码方式:除了真正要执行的代码,把其他功能代码都写在函数当中。

  绝大部分的模块,其创建的目的就是被导入,所以应该尽量只包括类、函数的定义。很多项目都只有一个主程序部分,由它导入模块、调用函数。

4.2 在主程序中书写测试代码

  测试代码应该在模块直接执行时被执行,模块被导入时不执行。(即用到上面例子的最后if语句)

  测试代码应随着测试条件、结果变更时及时更新,且每次代码更新后都应执行测试代码,以确认没有新问题。

5 内存管理

5.1 变量定义

  变量无需声明,第一次被赋值时自动声明。

>>> x
Traceback (most recent call last):File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> x=4
>>> x
4

5.2 动态类型

  变量的类型和占用的内存,都是运行时确定的。赋值时,解释器根据语法和右操作数来决定新对象类型。对象创建后,将其引用赋给左边变量。

5.3 内存分配

  Python解释器负责内存管理,程序员无需关心。

5.4 引用计数

  Python内部记录着使用中的对象各有多少引用,对象的引用数目简称引用计数。当对象的引用计数为0时,它就被垃圾回收。

  增加引用计数:

x = 3.14    #对象被创建
y = x      #对象的别名被创建,即对象被赋值给一个新变量
foobar(x)   #对象作为参数传递给函数(新的本地引用)
myList = [123, x, 'xyz']    #对象成为容器对象的一个元素

  减少引用计数:

一个本地引用离开了其作用范围,比如上面的foobar()函数结束时。
del y   #对象的别名被显式的销毁
x = 123  #对象的一个别名被赋值给其它的对象
myList.remove(x)  #对象被从一个窗口对象中移除
del myList  #窗口对象本身 离开作用范围 或 被销毁

  del语句:

del  obj1[, obj2[...]]     #可以一次删除多个对象的引用

  上面的 del y,会将y从现在的名字空间中删除,且y指向的对象引用计数减1。再执行del x后,该对象引用计数为0,对象从此“无法访问”。追踪或调试程序会增加对象的一个额外引用。

5.5 垃圾收集

  垃圾收集器是一段独立代码,用来寻找 引用计数为0的对象,也检查那些 引用计数不为0但应该被销毁的对象,然后释放其内存。

  当两个对象相互引用时,引用计数可能不会为0,因此垃圾收集器也包含循环垃圾收集器,来清理未引用的循环。

6 第一个Python程序

  介绍两个处理文本文件的脚本,分别实现写入/读取文件内容。

  makeTextFile.py,创建文件,输入每行文本:

#!/usr/bin/env python'makeTextFile.py -- create text file'import os
ls = os.linesep    #换行符,Unix为'\n',Windows为'\r\n',用os.linesep则不需关心平台。起个别名,减少名字查询,代码跑得快,名字也短while True:fname = raw_input('Enter filename: ')if os.path.exists(fname):    #判断文件是否已存在,存在则返回Trueprint "ERROR: '%s' already exists" % fnameelse:breakall = []
print "\nEnter lines ('.' by itself to quit).\n"while True:entry = raw_input('> ')if entry == '.':    #输入'.'时结束输入breakelse:all.append(entry)    #将输入内容添加到列表中

fobj = open(fname, 'w')
fobj.writelines(['%s%s' % (x, ls) for x in all])    #列表解析。writelines接收包含行结束符的结果列表,并写入文件
fobj.close()
print 'DONE!'

  readTextFile.py,读取并显示文本内容:

#!/usr/bin/env Python'readTextFile.py -- read and display text file'fname = raw_input('Enter filename: ')
printtry:    #捕获异常语句,适用于没有合适函数处理异常的情况。这里没有使用上面的os.path.exsits()函数,因为打开文件错误可能不仅仅是文件名错误导致fobj = open(fname, 'r')
except IOError, e:    #如果打开文件错误,则捕获异常,并输出异常提示信息,然后跳过elseprint "*** file open error:", e
else:   #如果成功打开文件,则执行该子句for eachLine in fobj:print eachLine,  #创建文件时,我们人为加入了换行符,所以这里打印的时候要抑制print生成的换行符fobj.close()

7 相关模块和开发工具

  工具:Python代码风格指南(PEP8),Python快速参考和Python常见问答。

  模块:

  • 调试模块pdb:允许设置(条件)断点,代码逐行执行,检查堆栈。还支持事后调试。
  • 日志模块logging:定义了一些函数和类帮程序实现灵活的日志系统。有五级日志级别:紧急,错误,警告,信息,调试。
  • 性能测试模块:profile,hotshot,cProfile。

练习题

3–11 字符串格式化 不再抑制readTextFile.py中print语句生成的 NEWLINE 字符,修改你的代码,在显示一行之前删除每行末尾的空白。这样,你就可以移除print语句末尾的逗号了。

提示:使用字符串对象的strip()方法

 1 #!/usr/bin/env Python
 2
 3 'readTextFile.py -- read and display text file'
 4
 5 fname = raw_input('Enter filename: ')
 6 print
 7
 8 try:
 9     fobj = open(fname, 'r')
10 except IOError, e:
11     print "*** file open error:", e
12 else:
13     for eachLine in fobj:
14         print eachLine.strip()    #将逗号改为 .strip() ,此时读入的字串后面的换行符作为空白被舍弃,但是仍然输出print的换行符
15     fobj.close() 

3-11 View Code

转载于:https://www.cnblogs.com/qieerbushejinshikelou/p/3719813.html

Python核心编程--学习笔记--3--Python基础相关推荐

  1. Python核心编程学习笔记(一)

    1.把一个字符串赋值给变量str.先用print来显示变量的内容,然后用变量名称来显示: >>>str = 'Hello World!' >>>print str ...

  2. python起步输入-[转载]python核心编程学习笔记-python起步

    python通过两种方式来实现你的需求:语句和表达式 语句:使用关键字组成命令 >>> print 'Hello wolrd!' Hello wolrd! 表达式:可以是算术表达式或 ...

  3. Python核心编程学习笔记-2016-07-24-01-理解copy和deepcopy

    6.20节 copy实施方式: (1)完全切片操作[:] (2)工厂函数list(),tuple()等 (3)copy模块的copy函数 copy可以说是创建了了一个新的对象,但是内容仍然是原对象的引 ...

  4. 编程学习笔记之python深入之装饰器案例及说明文档[图]

    编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰,所以称为装饰 ...

  5. python网络编程学习笔记(二)

    python网络编程学习(四) 多用途客户端协议 一.ftp 功能:上传下载文件,删除命名文件,建立删除目录,自动压缩,保存目录 1.代码: #coding=utf-8 '''连接远程ftp服务器,显 ...

  6. Python核心编程读书笔记

    转载自 http://blog.csdn.net/hunter8777/article/category/786856 本次笔记针对原书1~2章节 第一章:欢迎来到Python的世界 1.在C语言中, ...

  7. python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...

    python的socket编程问题hdr = recvall(s, 5) if hdr is None: print 'Unexpected EOF receivingstruct在unpack的时候 ...

  8. Python 网络编程学习笔记(二)——DNS 域名解析客户端程序设计

    本博文介绍如何使用 Python 网络编程,设计并实现客户端的 DNS 域名解析及缓存服务. 1 基本概念 域名系统(DNS)是一个庞大的.全球的分布式数据库,,它主要用来把主机名转换成 IP 地址, ...

  9. Python计算机视觉编程学习笔记 三 图像到图像的映射

    图像到图像的映射 (一)单应性变换 1.2 仿射变换 (二)图像扭曲 2.1 图像中的图像 2.2 图像配准 (三)创建全景图 3.1 RANSAC 3.2 拼接图像 (一)单应性变换 单应性变换是将 ...

  10. 【C++】黑马程序员-C++核心编程学习笔记

    前言 根据黑马程序员C++课程内容,结合讲义,将自己学习C++的过程中将自己觉得有必要记下的笔记进行整理,方便复习回顾,编程环境为VSCode. 本阶段主要针对C++面向对象编程技术做详细讲解,探讨C ...

最新文章

  1. JS 添加网页桌面快捷方式的代码
  2. undefined symbol: ap_log_rerror;apache2.4与weblogic点so文件
  3. 卫星图像中的车辆分析--A Large Contextual Dataset for Classification, Detection and Counting of Cars
  4. Xshell连接Ubuntu报错 “服务器发送了一个意外的数据包”
  5. 超详细!百度富媒体检索比对系统的关键技术
  6. Nginx 性能优化
  7. 编程中的移位运算符简单解释
  8. android fragment 教程,Android Fragment教程总结
  9. 允许Fedora 12以root身份登录图形界面
  10. drain open 线与_再转一个:push-pull and open-drain,开漏(open drain)和开集(open collector...
  11. Linux下安装配置git
  12. SQL:pgsql查询geom参考系以及更改geom参考系
  13. web测试 结果存储类型为“Database”,但尚未指定结果储存库连接字符串
  14. 《说服力》读后总结摘录
  15. 梦之光芒/黑客小游戏
  16. Guitar Pro2023中文版本下载及简谱功能详细介绍
  17. 绝地求生 服务器无响应,绝地求生卡在登陆页面怎么办
  18. P2698 [USACO12MAR]花盆Flowerpot(单调队列+二分)
  19. Javacv Javacv+ffmpeg+Nginx 监控/直播 学习教程
  20. 后台管理有什么作用?

热门文章

  1. CYQ.Data 轻量数据访问层(七) 自定义数据表实现绑定常用的数据控件(上)
  2. 转载的关于pthread_cond_wait的文章,写的比较详细
  3. linux VM命令下查找
  4. 解决在 WP8/ WP8.1 项目中 引用 C++ 组件时出现的 System.TypeLoadException 错误
  5. 1.4-shell中特殊符号
  6. 详解BSCI实验一、配置EIGRP 验证,汇总
  7. java多线程知识点之wait和sleep的区别
  8. Eclipse创建并运行Java程序输出Hello World
  9. js基础-19-判断图片加载完成的方法
  10. mysql删除注册表mysqld要删除吗_删库就一定要跑路吗?rm删除文件后空间还存在似乎说明了什么...