热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python核心编程入门_Python核心编程学习笔记3Python基础

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

本章介绍基本的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

>>>x1

>>>y1

>>>z1

>>> x = ( y = 13)

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

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

+=   -= *= /= %= **=  #Python支持的增量赋值符

<<&#61; >>&#61; &&#61; ^&#61; |&#61;

>>> aList &#61; [123, &#39;xyz&#39;]>>> aList &#43;&#61; [45.6e7]  #列表加

>>>aList

[123, &#39;xyz&#39;, 456000000.0]>>> n&#61;3

>>> --n  #与C语言不同

3

>>>n3

>>> n--  #语法错误

File "", line 1n--

^SyntaxError: invalid syntax

多元赋值&#xff0c;即同时给多个变量赋值&#xff1a;

>>> x, y, z &#61; 1, 2, &#39;a string&#39;  #等号两边实质是元组&#xff0c;建议总是加上括号&#xff0c;即 (x, y, z) &#61; (1, 2, &#39;string&#39;)

>>>x1

>>>y2

>>>z&#39;a string&#39;

>>> x, y &#61; 1, 2

>>>x1

>>>y2

>>> x, y &#61; y, x  #不需要中间变量&#xff0c;即可交换两个变量值

>>>x2

>>>y1

3 标识符

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

关键字&#xff1a;关键字列表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

>>> importkeyword>>> keyword.iskeyword(&#39;and&#39;)

True

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

类变量的专用下划线标识符&#xff1a;

_xxx #不用&#39;from module import *&#39;导入&#xff0c;外部可以访问&#xff0c;但是应视其为 私有变量

__xxx__ #系统定义名字&#xff0c;特殊变量&#xff0c;可以直接访问&#xff0c;自己不要使用这种变量名

__xxx #类中的私有变量名&#xff0c;外部无法访问(实质上&#xff0c;一般的编译器&#xff0c;都将其改名为 _所属类名__xxx)

4 基本风格指南

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

import this #可以看到Python之禅

4.1 模块结构和布局

编写脚本文件pytest.py&#xff0c;并执行&#xff1a;

#/usr/bin/env python #1.起始行(Unix) / 模块注释#-*- coding: utf-8 -*- #如果代码包含中文&#xff0c;需要添加该行(由于出现在该注释之前&#xff0c;上一行的中文注释会被报错)

"this is a test module" #2.模块文档&#xff0c;可通过 模块名.__doc__ 直接访问

import sys #3.导入所需的模块

importos

debug&#61; True #4.全局变量。尽量少使用全局变量&#xff0c;有利于代码维护&#xff0c;提高性能&#xff0c;节省内存

class FooClass(object): #5.类定义&#xff0c;模块被导入时类就会被定义

"Foo class" #类文档&#xff0c;可通过 模块名.类名.__doc__ 来访问

pass

def test(): #6.函数定义&#xff0c;模块被导入时类就会被定义&#xff0c;可通过 模块名.函数名() 来访问

"test function" #函数文档&#xff0c;可通过 模块名.函数名.__doc__ 来访问

foo &#61; FooClass() #类对象

ifdebug:print &#39;ran test()&#39;

if __name__ &#61;&#61; &#39;__main__&#39;: #7.主程序部分&#xff0c;通常只包含函数调用&#xff0c;无论是被导入还是作为脚本执行&#xff0c;都会执行这部分代码

test() #如果模块直接执行&#xff0c;则__name__值为&#39;__main__&#39;&#xff0c;该句执行&#xff1b;如果被导入&#xff0c;则__name__值为模块名

$ python pytest.py #作为脚本直接执行

ran test()>>> import pytest #交互解释器中&#xff0c;导入模块&#xff0c;主程序部分的if条件不成立。模块名即去掉后缀的文件名

>>> pytest.__doc__  #模块文档

&#39;this is a test module&#39;

>>> pytest.FooClass.__doc__ #模块内的类文档

&#39;Foo class&#39;

>>> pytest.test() #执行模块内函数

ran test()

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

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

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

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

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

5 内存管理

5.1 变量定义

变量无需声明&#xff0c;第一次被赋值时自动声明。

>>>x

Traceback (most recent call last):

File"", line 1, in NameError: name&#39;x&#39; is notdefined>>> x&#61;4

>>>x4

5.2 动态类型

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

5.3 内存分配

Python解释器负责内存管理&#xff0c;程序员无需关心。

5.4 引用计数

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

增加引用计数&#xff1a;

x &#61; 3.14 #对象被创建

y &#61; x   #对象的别名被创建&#xff0c;即对象被赋值给一个新变量

foobar(x) #对象作为参数传递给函数(新的本地引用)

myList &#61; [123, x, &#39;xyz&#39;] #对象成为容器对象的一个元素

减少引用计数&#xff1a;

一个本地引用离开了其作用范围&#xff0c;比如上面的foobar()函数结束时。del y   #对象的别名被显式的销毁

x &#61; 123 #对象的一个别名被赋值给其它的对象

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

del myList  #窗口对象本身 离开作用范围 或 被销毁

del语句&#xff1a;

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

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

5.5 垃圾收集

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

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

6 第一个Python程序

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

makeTextFile.py&#xff0c;创建文件&#xff0c;输入每行文本&#xff1a;

#!/usr/bin/env python

&#39;makeTextFile.py -- create text file&#39;

importos

ls&#61; os.linesep #换行符&#xff0c;Unix为&#39;\n&#39;&#xff0c;Windows为&#39;\r\n&#39;&#xff0c;用os.linesep则不需关心平台。起个别名&#xff0c;减少名字查询&#xff0c;代码跑得快&#xff0c;名字也短

whileTrue:

fname&#61; raw_input(&#39;Enter filename:&#39;)if os.path.exists(fname): #判断文件是否已存在&#xff0c;存在则返回True

print "ERROR: &#39;%s&#39; already exists" %fnameelse:breakall&#61;[]print "\nEnter lines (&#39;.&#39; by itself to quit).\n"

whileTrue:

entry&#61; raw_input(&#39;>&#39;)if entry &#61;&#61; &#39;.&#39;: #输入&#39;.&#39;时结束输入

break

else:

all.append(entry)#将输入内容添加到列表中

fobj&#61; open(fname, &#39;w&#39;)

fobj.writelines([&#39;%s%s&#39; % (x, ls) for x in all]) #列表解析。writelines接收包含行结束符的结果列表&#xff0c;并写入文件

fobj.close()print &#39;DONE!&#39;

readTextFile.py&#xff0c;读取并显示文本内容&#xff1a;

#!/usr/bin/env Python

&#39;readTextFile.py -- read and display text file&#39;fname&#61; raw_input(&#39;Enter filename:&#39;)print

try: #捕获异常语句&#xff0c;适用于没有合适函数处理异常的情况。这里没有使用上面的os.path.exsits()函数&#xff0c;因为打开文件错误可能不仅仅是文件名错误导致

fobj &#61; open(fname, &#39;r&#39;)except IOError, e: #如果打开文件错误&#xff0c;则捕获异常&#xff0c;并输出异常提示信息&#xff0c;然后跳过else

print "*** file open error:", eelse: #如果成功打开文件&#xff0c;则执行该子句

for eachLine infobj:printeachLine,  #创建文件时&#xff0c;我们人为加入了换行符&#xff0c;所以这里打印的时候要抑制print生成的换行符

fobj.close()

7 相关模块和开发工具

工具&#xff1a;Python代码风格指南(PEP8)&#xff0c;Python快速参考和Python常见问答。

模块&#xff1a;

调试模块pdb&#xff1a;允许设置(条件)断点&#xff0c;代码逐行执行&#xff0c;检查堆栈。还支持事后调试。

日志模块logging&#xff1a;定义了一些函数和类帮程序实现灵活的日志系统。有五级日志级别&#xff1a;紧急&#xff0c;错误&#xff0c;警告&#xff0c;信息&#xff0c;调试。

性能测试模块&#xff1a;profile&#xff0c;hotshot&#xff0c;cProfile。

练习题

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

提示&#xff1a;使用字符串对象的strip()方法

1 #!/usr/bin/env Python

2

3 &#39;readTextFile.py -- read and display text file&#39;

4

5 fname &#61; raw_input(&#39;Enter filename:&#39;)6 print

7

8 try:9 fobj &#61; open(fname, &#39;r&#39;)10 exceptIOError, e:11 print "*** file open error:", e12 else:13 for eachLine infobj:14 print eachLine.strip() #将逗号改为 .strip() &#xff0c;此时读入的字串后面的换行符作为空白被舍弃&#xff0c;但是仍然输出print的换行符

15 fobj.close()

3-11 View Code



推荐阅读
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
author-avatar
虎妞甜言蜜语说给上_235
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有