集合
集合(set):是一个无序的不重复元素序列
集合的创建: 使用大括号 { } 或者 set() 函数创建集合;
注意事项:
- 创建一个空集合必须用 set() 而不是 { }
- {}是用来创建一个空字典。
集合的内建方法
1、增加:
- add()
- update()
2、删除: - clear()
- discard()
- pop()
- remove()
3、查() - 差集:difference() difference_update()
- 交集:intersection() intersection_update()
- 对称差分:symmetric_difference() symmetric_difference_update()
- 并集:union()
- 判断:isdisjoint() issubset() issuperset()
实例:
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从大到小排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。
给定一个整数数组,判断是否存在重复元素,如果任何值在数组中至少出现两次,函数返回true,如果数组中每个元素都不相同,则返回false
frozenset
frozenset 是 set 的不可变版本,因此 set 集合中所有能改变集合本身的方法frozenset 都不支持;set 集合中不改变集合本身的方法,fronzenset 都支持。
frozenset 的方法和 set 集合同名方法的功能完全相同。frozenset 的作用主要有两点:
- 当集合元素不需要改变时,使用 frozenset 代替 set 更安全。
- 当某些 API 需要不可变对象时,必须用 frozenset 代替set。比如 dict 的 key 必须是不可变对象,因此只能用 frozenset;再比如 set 本身的集合元素必须是不可变的,因此 set 不能包含 set,set 只能包含 frozenset。
字典
字典是另一种可变容器模型,且可存储任意类型对象。
键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一
字典创建:
内建方法:fromkeys(字典中的key有相同的value值,默认为None)
zip间接创建:
字典的内建方法
增:
- 根据key值:dic[key]=value
- setdafault():如果key值已经存在,不做修改,如不存在添加key-value值
- update:如key值存在更新value,如key不存在则添加key-value值
删: - clear:移除字典中所有元素
- del dic[‘key’]:根据key值删除
- pop():弹出指定key-value值
查: - services.key():查看所有key值
- services.values():查看所有的value值
- services.items():查看所有的key-value值
实例:
作为字典(key-value)的经典应用题目,单词统计几乎出现在每一种语言键值对学习后的必练题目,主要需求:
写一个函数wordcount统计一篇文章的每个单词出现的次数(词频统计)。统计完成后,对该统计按单词频次进行排序。
函数
什么是函数
如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数.
函数的优点
1.降低编程的难度
2.代码重用(避免重复劳动,提高工作效率)
函数的实现
从实现函数的角度来看,其至少需要想清楚以下 3 点:
1.函数需要几个关键的需要动态变化的数据,这些数据应该被定义成函数的参数。
2.函数需要传出几个重要的数据(就是调用该函数的人希望得到的数据),这些数据应该被定义成返回值。
3.函数的内部实现过程。
函数的创建和调用
定义函数,也就是创建函数,需要使用def关键字实现定义函数:
实例:x与y比较大小,输出大的数
pass:定义一个什么也不做的空函数可以使用pass语句,pass作为占位符,让代码能先运行起来
调用函数也就是执行函数:将创建的函数理解为一个工具,调用函数就相当于使用该工具
函数调用基本语法格式:函数名([形参值])
其中返回值,就是当程序中函数完成一件事情后,返回给调用者的结果,若没有返回值,则默认返回None
变量作用域
局部变量与全局变量
局部变量
局部变量,就是在函数内部定义的变量
- 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
- 局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用
全局变量
如果一个变量既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量
- 在函数外边定义的变量叫做全局变量
- 全局变量能够在所有的函数中进行访问
- 如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错
- 如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的
global:global的本质是声明可以修改全局变量的指向即变量可以指向新的数据。
1、不可变类型的全局变量: 指向的数据不能修改, 不使用global时无法修改全局变量。
2、可变类型的全局变量: 指向的数据可以修改, 不使用global时可以修改全局变量。
函数参数传递
定义时小括号中的参数,用来接收参数用的,称为 “形参”
调用时小括号中的参数,用来传递给函数用的,称为 “实参”
如果已经有一个 list 或者 tuple,要调用一个可变参数怎么办?
1). Python 允许你在 list 或 tuple 前面加一个 * 号;
2). 把 list 或 tuple 的元素变成可变参数传进去
关键字参数
- 关键字参数允许传入 0 个或任意个含参数名的参数;
- 这些关键字参数在函数内部自动组装为一个 dict;
- 关键字参数用**kwargs;
参数组合
- 参数组合是指可以必选参数、 默认参数、 可变参数和关键字参数一起使用
- 参数定义的顺序必须是:必选参数、 默认参数、可变参数和关键字参数。
参数总结
必选参数:参数类型可任意
默认参数:默认参数一定要用不可变对象
可变参数:
1、*args是可变参数
2、args接受的是一个tuple
关键字参数:
1、**kw是关键字参数
2、kw接收的是一个dict
注意事项:对于任意函数,都可以通过类似func(*args, **kw)
的形式调用它
匿名函数
匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明。(省略了用def声明函数的标准步骤)
lambda函数语法为:lambda[arg1[,arg2,…argn]]:expression
lambda函数能接收任何数量的参数但只能返回一个表达式的值
递归函数
实例:
冒泡排序法:
快速排序法:
import random
def quickly(num):
if len(num) < 2:
return num
else:
mark = num[0]
big = []
small = []
num.remove(mark)
for i in num:
if i > mark:
big.append(i)
else:
small.append(i)
return quickly(big) + [mark] + quickly(small)
num = [random.randint(1,100) for i in range(10)]
print("生成的数字为:",num)
print("排序后的数字为:",quickly(num))
运行结果