词典

词典(dictionary)与列表相似,也可以存储多个元素。存储多个元素的对象称为容器(container);

常见的创建词典的方法:

>>>dic = {'tom':11, 'sam':57,'lily':100}>>>print type(dic)

与表类似,以逗号分隔每一个元素;每一个元素包含两个部分,键和值;(不可以变的对象可以作为键)。值可以是任意对象;键和值是一一对应;

与表不同的是,词典的元素没有顺序。你不能通过下标引用元素。词典是通过键来引用。
>>>print dic['tom']>>>dic['tom'] = 30>>>print dic

在词典中增添一个新元素的方法:

>>>dic['limi'] = 99>>>print dic

这里,我们引用一个新的键,并赋予它对应的值。

词典元素的循环调用
dic = {'lilei': 90, 'lily': 100, 'sam': 57, 'tom': 90}
for key in dic:print dic[key]

在循环中,dict的每个键,被提取出来,赋予给key变量。

通过print的结果,我们可以再次确认,dic中的元素是没有顺序的。
 
词典常用方法
>>>print dic.keys()           # 返回dic所有的键>>>print dic.values()         # 返回dic所有的值>>>print dic.items()          # 返回dic所有的元素(键值对)>>>dic.clear()                # 清空dic,dict变为{}

另外有一个很常用的用法:
>>>del dic['tom']             # 删除 dic 的‘tom’元素

del是Python中保留的关键字,用于删除对象。
与表类似,你可以用len()查询词典中的元素总数。
>>>print(len(dic))

文本文件的输入输出

创建文件对象

我们打开一个文件,并使用一个对象来表示该文件:

f = open(文件名,模式)
最常用的模式有:

"r"     # 只读

“w”     # 写入
比如
>>>f = open("test.txt","r")

具体用法需要在实践,这里只是简单的整体概括

模块

在Python中,一个.py文件就构成一个模块。通过模块,你可以调用其它文件中的程序。
引入模块
先写一个first.py文件,内容如下:
def laugh():print 'HaHaHaHa'

再写一个second.py,并引入first中的程序:
import first
for i in range(10):first.laugh()

在second.py中,我们使用了first.py中定义的laugh()函数。

引入模块后,可以通过模块.对象的方式来调用引入模块中的某个对象。

上面例子中,first为引入的模块,laugh()是我们所引入的对象。

Python中还有其它的引入方式,

import a as b               # 引入模块a,并将模块a重命名为bfrom a import function1     # 从模块a中引入function1对象。调用a中对象时,我们不用再说明模块,即直接使用function1,而不是a.function1。from a import *             # 从模块a中引入所有对象。调用a中对象时,我们不用再说明模块,即直接使用对象,而不是a.对象。

这些引用方式,可以方便后面的程序书写。

搜索模块的路径

Python会在以下路径中搜索它想要寻找的模块:

  1. 程序所在的文件夹
  2. 标准库的安装路径
  3. 操作系统环境变量PYTHONPATH所包含的路径
如果你有自定义的模块,或者下载的模块,可以根据情况放在相应的路径,以便Python可以找到。

模块包

可以将功能相似的模块放在同一个文件夹(比如说this_dir)中,构成一个模块包。通过

import this_dir.module

引入this_dir文件夹中的module模块。
该文件夹中必须包含一个__init__.py的文件,提醒Python,该文件夹为一个模块包。__init__.py可以是一个空文件。
 
函数参数

值传递
def f(a,b,c):return a+b+cprint(f(1,2,3))

在调用f时,1,2,3根据位置分别传递给了a,b,c。
 
关键字传递

有些情况下,用位置传递会感觉比较死板。关键字(keyword)传递是根据每个参数的名字传递参数。

关键字并不用遵守位置的对应关系。依然沿用上面f的定义,更改调用方式:

print(f(c=3,b=2,a=1)) 

关键字传递可以和位置传递混用。但位置参数要出现在关键字参数之前:

print(f(1,c=3,b=2))

参数默认值

在定义函数的时候,使用形如c=10的方式,可以给参数赋予默认值(default)。

如果该参数最终没有被传递值,将使用该默认值。

def f(a,b,c=10):return a+b+cprint(f(3,2))
print(f(3,2,1))

在第一次调用函数f时, 我们并没有足够的值,c没有被赋值,c将使用默认值10.

第二次调用函数的时候,c被赋值为1,不再使用默认值。
包裹传递
位置传递,其实传过去的是一个tuple

下面是包裹位置传递的例子:

def func(*name):print type(name)print namefunc(1,4,6)
func(5,6,7,1,2,3)

两次调用,尽管参数个数不同,都基于同一个func定义。在func的参数表中,所有的参数被name收集,根据位置合并成一个元组(tuple),这就是包裹位置传递。

为了提醒Python参数,name是包裹位置传递所用的元组名,在定义func时,在name前加*号。
下面是包裹关键字传递的例子:
其实是字典传递

def func(**dict):print type(dict)print dictfunc(a=1,b=9)
func(m=2,n=1,c=11)

与上面一个例子类似,dict是一个字典,收集所有的关键字,传递给函数func

。为了提醒Python,参数dict是包裹关键字传递所用的字典,在dict前加**。

包裹传递的关键在于定义函数时,在相应元组或字典前加*或**。
解包裹

*和**,也可以在调用的时候使用,即解包裹(unpacking), 下面为例:

def func(a,b,c):print a,b,cargs = (1,3,4)
func(*args)

在这个例子中,所谓的解包裹,就是在传递tuple时,让tuple的每一个元素对应一个位置参数。

在调用func时使用*,是为了提醒Python:

我想要把args拆成分散的三个元素,分别传递给a,b,c。(设想一下在调用func时,args前面没有*会是什么后果?)

相应的,也存在对词典的解包裹,使用相同的func定义,然后:

dict = {'a':1,'b':2,'c':3}
func(**dict)

在传递词典dict时,让词典的每个键值对作为一个关键字传递给func。

循环设计

range()

在Python中,for循环后的in跟随一个序列的话,循环每次使用的序列元素,而不是序列的下标。

之前我们已经使用过range()来控制for循环。现在,我们继续开发range的功能,以实现下标对循环的控制:

S = 'abcdefghijk'
for i in range(0,len(S),2):print S[i]

在该例子中,我们利用len()函数和range()函数,用i作为S序列的下标来控制循环。在range函数中,分别定义上限,下限和每次循环的步长。这就和C语言中的for循环相类似了。
enumerate()

利用enumerate()函数,可以在每次循环中同时得到下标和元素:

S = 'abcdefghijk'

for (index,char) in enumerate(S):print indexprint char

实际上,enumerate()在每次循环中,返回的是一个包含两个元素的定值表(tuple),两个元素分别赋予index和char

zip()

如果你多个等长的序列,然后想要每次循环时从各个序列分别取出一个元素,可以利用zip()方便地实现:

ta = [1,2,3]
tb = [9,8,7]
tc = ['a','b','c']
for (a,b,c) in zip(ta,tb,tc):print(a,b,c)

每次循环时,从各个序列分别从左到右取出一个元素,合并成一个tuple,然后tuple的元素赋予给a,b,c

zip()函数的功能,就是从多个列表中,依次各取出一个元素。每次取出的(来自不同列表的)元素合成一个元组,合并成的元组放入zip()返回的列表中。zip()函数起到了聚合列表的功能。
解析zip():
>>> ta = [1,2,3]
>>> tb = [4,5,6]
>>> zipped = zip(ta,tb)
>>> print type(zipped)
<type 'list'>
>>> print zipped
[(1, 4), (2, 5), (3, 6)]
>>> print zipped[1]
(2, 5)

循环对象
循环对象是这样一个对象,它包含有一个next()方法(__next__()方法,在python 3x中), 这个方法的目的是进行到下一个结果,而在结束一系列结果之后,举出StopIteration错误。
例子:
假设我们有一个test.txt的文件:
1234
abcd

efg

我们运行一下python命令行:

>>>f = open('test.txt')>>>f.next()>>>f.next()...

不断输入f.next(),直到最后出现StopIteration
open()返回的实际上是一个循环对象,包含有next()方法。而该next()方法每次返回的就是新的一行的内容,到达文件结尾时举出StopIteration。这样,我们相当于手工进行了循环。
自动的话:
for line in open('test.txt'):print line

在这里,for结构自动调用next()方法,将该方法的返回值赋予给line。循环知道出现StopIteration的时候结束。
相对于序列,用循环对象的好处在于:不用在循环还没有开始的时候,就生成好要使用的元素。所使用的元素可以在循环过程中逐次生成。这样,节省了空间,提高了效率,编程更灵活。
异常处理

在项目开发中,异常处理是不可或缺的。异常处理帮助人们debug,通过更加丰富的信息,让人们更容易找到bug的所在。异常处理还可以提高程序的容错性。

我们之前在讲循环对象的时候,曾提到一个StopIteration的异常,该异常是在循环对象穷尽所有元素时的报错。

我们以它为例,来说明基本的异常处理。

一个包含异常的程序:
re = iter(range(5))for i in range(100):print re.next()print 'HaHaHaHa'

首先,我们定义了一个循环对象re,该循环对象将进行5次循环,每次使用序列的一个元素。

在随后的for循环中,我们手工调用next()函数。当循环进行到第6次的时候,re.next()不会再返回元素,而是抛出(raise)StopIteration的异常。整个程序将会中断。
我们可以修改以上异常程序,直到完美的没有bug。但另一方面,如果我们在写程序的时候,知道这里可能犯错以及可能的犯错类型,我们可以针对该异常类型定义好”应急预案“。
re = iter(range(5))
try:for i in range(100):print re.next()
except StopIteration:print 'here is end 'print 'HaHaHaHa'

在try程序段中,我们放入容易犯错的部分。我们可以跟上except,来说明如果在try部分的语句发生StopIteration时,程序该做的事情。如果没有发生异常,则except部分被跳过。

随后,程序将继续运行,而不是彻底中断。
完整的语法结构如下:
try:...
except exception1:...
except exception2:...
except:...
else:...
finally:...

如果try中有异常发生时,将执行异常的归属,执行except。异常层层比较,看是否是exception1, exception2...,直到找到其归属,执行相应的except中的语句。如果except后面没有任何参数,那么表示所有的exception都交给这段程序处理。比如:
try:print(a*2)
except TypeError:print("TypeError")
except:print("Not Type Error & Error noted")

由于a没有定义,所以是NameError。异常最终被except:部分的程序捕捉。

如果无法将异常交给合适的对象,异常将继续向上层抛出,直到被捕捉或者造成主程序报错。比如下面的程序
def test_func():try:m = 1/0except NameError:print("Catch NameError in the sub-function")try:test_func()
except ZeroDivisionError:print("Catch error in the main program")

子程序的try...except...结构无法处理相应的除以0的错误,所以错误被抛给上层的主程序。

如果try中没有异常,那么except部分将跳过,执行else中的语句。

finally是无论是否有异常,最后都要做的一些事情。

流程如下,

try->异常->except->finally

try->无异常->else->finally

 
总结

  • 词典

    • dic={'tom':11,'sam':57}
    • 增加元素
      • dic['limi']=99
    • 注意
      • key-value,在对key的操作都要引号无论是定义或者引用。
      • 且key的值是不可变的,value是可以变动的;
    • 字典元素循环调用
      • for key in dic:
    • 常用方法
      • >>> dic.keys()     # 返回dic所有的键
      • >>> dic.values()  # 返回dic所有的值
      • >>> dic.items()   # 返回dic所有的元素(键值对)
      • >>> dic.clear()    # 清空dic,dict变为{}
      • >>> del dic['tom']  # 删除 dic 的‘tom’元素
  • 文本文件输入输出
    • 创建文件对象

      • f = open(文件名,模式)

        • 模式

          • "r"     # 只读
          • “w” # 写入
  • 模块
    • 模块引用

      • import a as b
      • from a import function1
      • from a import *
    • 搜索模块的路径
      • - 程序所在的文件夹
      • - 标准库的安装路径
      • - 操作系统环境变量PYTHONPATH所包含的路径
    • 模块包
      • 将功能相似的模块放在同一文件夹中(如this_dir)构成模块包

        • import this_dir.module
        • 引入this_dir 文件夹中的module模块
      • this_dir中必须包含 __init__.py文件,告诉Python这是一个模块包。
  • 函数参数
    • 值传递

      • 根据位置关系
    • 关键字传递
      • 根据关键字名称
    • 参数默认值
      • 调用时可以不用传值,而是用默认值
    • 包裹传递
      • def func(*name):

        • func(1,4,6): 将数 1,4,6 传给name 作为一个tuple (1,4,6)
        • func(5,6,7,1,2): 将数5,6,7,1,2 传给name 作为一个tuple(5,6,7,1,2)
      • def func(**dict):
        • func(a=1,b=9):将数a=1,b=9 传给dict作为字典('a':1,'b':9)
      • 像是将数据打包一起传送,因此叫做包裹传递
    • 解包裹
      • def func(a,b):

        • args=(1,2)

          • func(*args)
          • 传递的时候,将一个tuple args 传过去变成 三个数
        • dict={'a':1,'b':2}
          • func(**dict)
          • 传递的时候,将字典 dict 传过去变成三个数
        • 注意,tuple 传是* ,dict传则是**
  • 循环设计
    • range()

      • 定义:上限,下限,步长
    • enumerate()
      • 返回下标以及值
    • zip()
      • 从多个列表中,依次各取出一个元素
    • for line in open('test.txt'):
  • 异常处理
    • try->异常->except->finally
    • try->无异常->else->finally

转载于:https://www.cnblogs.com/Aiapple/p/5261503.html

python基础学习笔记2相关推荐

  1. Python基础学习笔记三

    Python基础学习笔记三 print和import print可以用,分割变量来输出 import copy import copy as co from copy import deepcopy ...

  2. Python基础学习笔记之(二)

    Python基础学习笔记之(二) zouxy09@qq.com http://blog.csdn.net/zouxy09 六.包与模块 1.模块module Python中每一个.py脚本定义一个模块 ...

  3. Python基础学习笔记之(一)

    Python基础学习笔记之(一) zouxy09@qq.com http://blog.csdn.net/zouxy09 前段时间参加微软的windows Azure云计算的一个小培训,其中Pytho ...

  4. Python基础学习笔记(一)

    Python基础学习笔记(一) 基本数据类型   整型(int):1.2.10--   浮点型(float):1.2.2.4.10.00--   布尔型(bool):True.False   字符串( ...

  5. Python 基础学习笔记 03

    Python基础系列 Python 基础学习笔记 01 Python 基础学习笔记 02 Python 基础学习笔记 03 Python 基础学习笔记 04 Python 基础学习笔记 05 文章目录 ...

  6. 8.Python基础学习笔记day8-正则表达式、网络编程、进程与线程

    8.Python基础学习笔记day8-正则表达式.网络编程.进程与线程 一.正则表达式 ''' 1. [1,2,3,4]中任意取3个元素排列: A43 = 4x3x2 = 24itertools.pe ...

  7. python笔记基础-python基础学习笔记(一)

    安装与运行交互式解释器 在绝大多数linux和 UNIX系统安装中(包括Mac OS X),Python的解释器就已经存在了.我们可以在提示符下输入python命令进行验证(作者环境ubuntu) f ...

  8. python基础学习笔记(九)

    python异常 python用异常对象(exception object)来表示异常情况.遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的 回溯(Traceback, 一种错误 ...

  9. Python基础学习笔记:匿名函数

    匿名函数 匿名函数就是不需要显示式的指定函数名 首先看一行代码: def calc(x,y):return x*y print(calc(2,3))# 换成匿名函数calc = lambda x,y: ...

  10. Python基础学习笔记:异常处理与断言(assertions)的运用

    python 提供了两个重要的功能来处理 python 程序在运行中出现的异常和错误: 异常处理 断言(assertions) 1.异常处理 捕捉异常可以使用 try/except 语句. try/e ...

最新文章

  1. 2022-2028中国快时尚服装市场竞争及发展前景预测报告
  2. json html显示中文乱码,后台请求json文件,中文出现乱码
  3. mysql 从物理文件恢复_从物理文件恢复MySQL数据库
  4. 2021全球权威AI性能竞赛MLPerf最新榜单: 浪潮获18项冠军几近半壁江山
  5. Linux命令之crontab命令
  6. splay伸展树基础操作(bzoj 1861: [Zjoi2006]Book 书架)
  7. 设计模式-------建造者模式(生成器模式)
  8. GitHub常用优秀开源Android项目
  9. 小米手机隐私相册在哪?将你的照片锁进“保险柜”
  10. 红日安全ATT&CK靶机实战系列之vulnstack1
  11. mssql数据库和Oracle数据库注入
  12. c8t6高电平电压_什么是高电平和低电平?
  13. PyCenterNetDetector is not in the models registry
  14. 立志做中国市场TOP2,新华三云屏底气何来?
  15. spring integration sftp
  16. [生存志] 第87节 张仪犀首纵横大战
  17. 极值分布的类型及性质-----极值理论的学习1
  18. ASP.NET MVC 音乐商店 - 2.控制器
  19. 【花雕动手做】有趣好玩的音乐可视化系列项目(28)--LED乒乓球灯
  20. flink sql 指南

热门文章

  1. myeclipse 2019中文版
  2. ThunderSoft Flash to HTML5中文版
  3. VMware ESXi 6.7服务器设置开机自动启动虚拟机
  4. 如何配置jenkins 与代理服务器吗?
  5. 正则学习小结(1)-基础
  6. Python3 列表的基本操作
  7. Linux - MiniFtp实现
  8. 结对编程之四则运算(马仪生、李瑞恒)
  9. 百度推出惊雷算法,打击快排产业,但重点是这个工具
  10. 67 个节省开发者时间的实用工具、库与资源(前端向)