一、字典

1.创建dict
d = {'Adam': 95,'Lisa': 85,'Bart': 59
}

我们把名字称为key,对应的成绩称为value,dict就是通过 key 来查找 value。花括号{ } 表示这是一个dict,然后按照 key: value, 写出来即可。最后一个 key: value 的逗号可以省略。并且key的数据类型可以不一样哦!
由于dict也是集合,len() 函数可以计算任意集合的大小

2.访问dict

可以简单地使用 d [key] 的形式来查找对应的 value,这和 list 很像,不同之处是,list 必须使用索引返回对应的元素,而dict使用key

注意: 通过 key 访问 dict 的value,只要 key 存在,dict就返回对应的value。如果key不存在,会直接报错:KeyError。
要避免 KeyError 发生,有两个办法:

  1. 先判断一下 key 是否存在,用 in 操作符:
if 'Paul' in d:print d['Paul']
  1. 使用dict本身提供的一个 get 方法,在Key不存在的时候,返回None:
>>> print d.get('Bart')
59
>>> print d.get('Paul')
None

题目:

根据如下dict:
d = {
‘Adam’: 95,
‘Lisa’: 85,
‘Bart’: 59
}
请打印出:
Adam: 95
Lisa: 85
Bart: 59

d = {'Adam': 95,'Lisa': 85,'Bart': 59
}
#方法一
for (key, value) in d.items():print("%s: %s" % (key, value))#方法二
print 'Adam:', d['Adam']
print 'Lisa:', d['Lisa']
print 'Bart:', d['Bart']
3.dict特点
  1. 列表内容dict的第一个特点是查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样。而list的查找速度随着元素增加而逐渐下降。不过dict的查找速度快不是没有代价的,dict的缺点是占用内存大,还会浪费很多内容,list正好相反,占用内存小,但是查找速度慢。
  2. 由于dict是按 key 查找,所以,在一个dict中,key不能重复。
  3. dict存储的key-value序对是没有顺序的!这和list不一样
  4. dict的第三个特点是作为 key 的元素必须不可变,Python的基本类型如字符串、整数、浮点数都是不可变的,都可以作为 key。但是list是可变的,就不能作为 key。
4. 更新dict

dict是可变的,也就是说,我们可以随时往dict中添加新的 key-value。比如已有dict:

d = {'Adam': 95,'Lisa': 85,'Bart': 59
}

要把新同学’Paul’的成绩 72 加进去,用赋值语句:

>>> d['Paul'] = 72

再看看dict的内容:

>>> print d
{'Lisa': 85, 'Paul': 72, 'Adam': 95, 'Bart': 59}

如果 key 已经存在,则赋值会用新的 value 替换掉原来的 value:

>>> d['Bart'] = 60
>>> print d
{'Lisa': 85, 'Paul': 72, 'Adam': 95, 'Bart': 60}

新来的Paul同学成绩是 75 分,请编写一个dict,把Paul同学的成绩也加进去。

d = {'Adam': 95,'Lisa': 85,'Bart': 59
}
d.update({'Paul':75})
print(d)
5.遍历dict
 d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }#方法一for key in d:print (key,d.get(key))
#方法二for (key,value) in d.items():print (key,value)
#方法三for key in d:   print (key,d[key])

二、set

set 持有一系列元素,这一点和 list 很像,但是set的元素没有重复,而且是无序的,这点和 dict 的 key很像,创建 set 的方式是调用 set() 并传入一个 list,list的元素将作为set的元素:

s=set(['a','b','c'])
print(s)

输出

{'c', 'a', 'b'}

请注意,上述打印的形式类似 list, 但它不是 list,仔细看还可以发现,打印的顺序和原始 list 的顺序有可能是不同的,因为set内部存储的元素是无序的。
set不能包含重复的元素,所以,当我们传入包含重复元素的 list 会怎么样呢?

s=set(['a','b','c','c'])
print(s)
print(len(s))

输出

{'b', 'c', 'a'}
3

结果显示,set会自动去掉重复的元素,原来的list有4个元素,但set只有3个元素。

1.访问set

由于set存储的是无序集合,所以我们没法通过索引来访问。访问 set中的某个元素实际上就是判断一个元素是否在set中。

s = set(['Adam', 'Lisa', 'Bart', 'Paul'])
print('Adam'in s)>>>True
2.set的特点

set存储的元素和dict的key类似,必须是不变对象,因此,任何可变对象是不能放入set中的。
判断某个元素在不在set里面

months = set(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])
x1 = 'Feb'
x2 = 'Sun'if x1 in months:print ('x1: ok')
else:print ('x1: error')if x2 in months:print ('x2: ok')
else:print ('x2: error')
3.遍历set

像list一样用for循环遍历,同样不是有序的。

months = set(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])
for mon in months:print(mon)
>>>
Jun
May
Apr
Jan
Jul
Feb
Oct
Dec
Sep
Aug
Nov
Mar

练习:请用 for 循环遍历如下的set,打印出 name: score 来。

s = set([(‘Adam’, 95), (‘Lisa’, 85), (‘Bart’, 59)])

s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
for x in s:print (x[0],':',x[1])
4.更新set

由于set存储的是一组不重复的无序元素,因此,更新set主要做两件事:
①. 是把新的元素添加到set中
②. 是把已有元素从set中删除。
添加元素时,用set的add()方法.

任务
针对下面的set,给定一个list,对list中的每一个元素,如果在set中,就将其删除,如果不在set中,就添加进去。
s = set([‘Adam’, ‘Lisa’, ‘Paul’])
L = [‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’]

s = set(['Adam', 'Lisa', 'Paul'])
L = ['Adam', 'Lisa', 'Bart', 'Paul']
for name in L:if name in s:s.remove(name)else:s.add(name)
print(s)

三、函数

abs()

#可以
s=-20
print(s)
print(abs(s))>>> 20
#不可以
s=-20
print(s)
abs(s)
print(s)

cmp(x,y)

比较函数 cmp(x, y) 就需要两个参数,
如果x小于y,则返回-1
如果x==y,则返回值为0
如果x>y,则返回值为1

int()

Python内置的常用函数还包括数据类型转换函数,比如 int()函数可以把其他数据类型转换为整数

s=int('123')
print(s+123)
>>> 246

str()

str()函数把其他类型转换成 str

str1=str(123)
print(str1)

sum()

任务
sum()函数接受一个list作为参数,并返回list所有元素之和。请计算 11 + 22 + 33 + … + 100100。

x=1
l=[]
while x<=100:l.append(x*x)x=x+1
print(sum(l))

编写函数

定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。
我们以自定义一个求绝对值的 my_abs 函数为例:

def my_abs(x):if x >= 0:return xelse:return -x

如果没有return语句,函数执行完毕后也会返回结果,只是结果为 None。return None可以简写为return。

请定义一个 square_of_sum 函数,它接受一个list,返回list中每个元素平方的和。

def square_of_sum(L):L2=[]x=0lens=len(L)while x<lens:L2.insert(x,L[x]*L[x])x=x+1return L2
print(square_of_sum([1, 2, 3, 4, 5]))
#以为是把元素变为自己的平方,仔细看题然后wrong,下面为正解
def square_of_sum(L):sum = 0for x in L:sum = sum + x * xreturn sum
print square_of_sum([1, 2, 3, 4, 5])
print square_of_sum([-5, 0, 5, 15, 25])

返回多值

math包提供了sin()和 cos()函数,我们先用import引用它

import math
def move(x, y, step, angle):nx = x + step * math.cos(angle)ny = y - step * math.sin(angle)return nx, ny
x, y = move(100, 100, 60, math.pi / 6)
>>> print x, y
151.961524227 70.0

但其实这只是一种假象,Python函数返回的仍然是单一值:

>>> r = move(100, 100, 60, math.pi / 6)
>>> print r(151.96152422706632, 70.0)

用print打印返回结果,原来返回值是一个tuple!
但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。

任务
一元二次方程的定义是:ax² + bx + c = 0
请编写一个函数,返回一元二次方程的两个解。
注意:Python的math包提供了sqrt()函数用于计算平方根。

#请参考求根公式:x = (-b±√(b²-4ac)) / 2a
#参考代码:
import math
def quadratic_equation(a, b, c):t = math.sqrt(b * b - 4 * a * c)return (-b + t) / (2 * a),( -b - t )/ (2 * a)
print quadratic_equation(2, 3, 0)
print quadratic_equation(1, -6, 5)

递归函数

递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。可以试试计算 fact(10000)。

任务
汉诺塔 (http://baike.baidu.com/view/191666.htm) 的移动也可以看做是递归函数。
我们对柱子编号为a, b, c,将所有圆盘从a移到c可以描述为:
如果a只有一个圆盘,可以直接移动到c;如果a有N个圆盘,可以看成a有1个圆盘(底盘) + (N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。
请编写一个函数,给定输入 n, a, b, c,打印出移动的步骤:
move(n, a, b, c)
例如,输入 move(2, ‘A’, ‘B’, ‘C’),打印出:
A --> B
A --> C
B --> C

def move(n, a, b, c):if n ==1:print a, '-->', creturnmove(n-1, a, c, b)print a, '-->', cmove(n-1, b, a, c)
move(4, 'A', 'B', 'C')def m

定义默认参数

123转换为8进制数

int('123', 8)
83

由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面

# OK:
def fn1(a, b=1, c=2):pass
# Error:
def fn2(a=1, b):pass

任务
请定义一个 greet() 函数,它包含一个默认参数,如果没有传入,打印 ‘Hello, world.’,如果传入,打印 ‘Hello, xxx.’
默认参数的默认值可以设定为’world’

参考代码:

def greet(name='world'):print 'Hello, ' + name + '.'
greet()
greet('Bart')

定义可变参数

如果想让一个函数能接受任意个参数,我们就可以定义一个可变参数:

def fn(*args):print args

可变参数的名字前面有个 * 号,我们可以传入0个、1个或多个参数给可变参数,Python解释器会把传入的一组参数组装成一个tuple传递给可变参数,因此,在函数内部,直接把变量 args 看成一个 tuple 就好了。
任务
请编写接受可变参数的 average() 函数。
可变参数 args 是一个tuple,当0个参数传入时,args是一个空tuple。

参考代码:

def average(*args):sum = 0.0if len(args) == 0:return sumfor x in args:sum = sum + xreturn sum / len(args)
print average()
print average(1, 2)
print average(1, 2, 2, 3, 4)

Python基础笔记(三) dict、set、函数相关推荐

  1. Python基础(三)_函数和代码复用

    三:函数和代码复用 (一)函数的基本使用 1.函数的定义 函数是一段具有特定功能的.可重用的语句组,用函数名来表示并通过函数名进行功能调用.函数也可以看作是一段具有名字的子程序,可以在需要的地方调用执 ...

  2. Python基础 笔记(三) 标识符、输入输出函数

    哈喽,大家好!今天来学习Python中的标识符和输入输出函数. 目录 一.标识符 二.输入函数 三.输出函数 四.print( )格式化输出 五.练习题 一.标识符 标识符:开发人员在程序中自定义的名 ...

  3. Python学习笔记三之编程练习:循环、迭代器与函数

    Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...

  4. Py函数直接传入root是啥意思_阿里云python课程笔记(四):函数amp;类和对象

    接阿里云python课程笔记(三):数据结构 我们讨论一下python中的深拷贝和浅拷贝 dic1 = {'user': 'lsgogroup', 'num': [1, 2, 3]}# 引用对象dic ...

  5. Python 基础笔记

    Python 基础笔记 内置函数 print() 打印输出 type() 数据类型查询 isinstance() 判断数据是否是已知类型 input() 接受键盘输入 range() 函数 forma ...

  6. python基础笔记(二)

    <黑马>python笔记~二 前言 一.配套视频 二.python基础初级 三.python基础中级 四.python基础高级 目录 python基础中级(列表.元组.字典.字符串) 01 ...

  7. python基础---元组、字典、函数、文件、异常

    文章目录 python基础---元组.字典.函数.文件.异常 Tuple(元组) 常用操作 dict(字典) 函数 文件 异常 python基础-元组.字典.函数.文件.异常 Tuple(元组) tu ...

  8. Python基础(三)--序列

    Python基础(三)--序列 1 序列相关的概念 1.1 什么是序列 序列是一种可迭代对象,可以存储多个数据,并提供数据的访问. 序列中的数据称为元素,Python内置的序列类型有:列表(list) ...

  9. Python基础第三课-基本数据类型

    Python基础第三课-基本数据类型 1.几个基本概念 1.1 表达式 1.2 语句 1.3 程序(program) 1.4 函数(function) 2.标识符 2.1 关键字 2.2 标识符概念 ...

最新文章

  1. 失败 安装scikit_scikit-learn0.22版本最新发布
  2. 重新认识HBase,Cassandra列存储——本质是还是行存储,只是可以动态改变列(每行对应的数据字段)数量而已,当心不是parquet...
  3. PHP/TP5 接口设计中异常处理
  4. PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.5. 安装后设置...
  5. 用MATLAB编程正弦稳态相量图,matlab课程设计--利用MATLAB对线性电路正弦稳态特性分析...
  6. python写前端和js_Python之路【第十二篇】前端之jsdomejQuery
  7. 名校生都去哪些互联网公司?
  8. 调试maven源代码
  9. php跨域传sessionid,php中http与https跨域共享session的解决方法
  10. Spring整合ActiveMQ之嵌入(二)
  11. 多线程下载辅助类实现
  12. Python网络数据采集1(译者:哈雷)
  13. (混沌序列统计特性)Maurer通用统计测试---matlab
  14. 计算机回收站概念,22.5.1 回收站概念
  15. 亚马逊网络关联是什么
  16. 源码中的@hide注释和{@hide}注释的差异
  17. Linux 运维必备 150 个命令,速度收藏~
  18. Mac安装Mysql卡在最后一步
  19. 【Linux】系统安装
  20. python - one day

热门文章

  1. [转载] python开源人工智能项目_推荐 10 个饱受好评且功能独特的开源人工智能项目
  2. Jrebel激活方法
  3. SQL-用JOIN连接多个表
  4. 一个key 在10w k/v 找到对应的. (B-tree), 这10w放进B-tree 会有多少层.
  5. 限制本机访问某一些网站,本人不再花时间看新闻了
  6. Linux文件内容查阅
  7. python获取月份字符串_python 时间字符串与日期转化
  8. android java 同步_Android 中的同步
  9. java开源论坛 discuz_Discuz开源论坛
  10. group python 读hdf5_Python处理Excel模块的对比分析