简介:此文是接着(萌新笔记)python的复习笔记 续写的第二篇(我比较弱鸡,所以本文可能会有记录很多我初学时遇到的问题,还请大家斟酌观看
Start!─=≡Σ٩( ๑╹ ꇴ╹)۶
字典不是序列类型,是映射类型 字典有 键、值、项(左边、右边、单个整体) 键 是独一无二的,键 和 值 都必须不可变
赋值和访问字典
>>>tep = dict((('I',1),('R',2),('O',3),('N',4))) #字典只能接受一个参数(此为元组内包含元组) >>>tep {'I':1,'R':2,'O':3,'N':4} #大括号 >>>tep = dict(I = 1,R = 2,O = 3,N = 4) #注意不能是'I' = 1 这个样子 >>>tep {'I':1,'R':2,'O':3,'N':4} #结果与上面的一样 >>>tep = dict(zip(['I','R','O','N',],[1,2,3,4])) >>>>tep {'I':1,'R':2,'O':3,'N':4} #结果与上面的一样 >>>tep {'I':1,'R':2,'O':3,'N':4} >>>tep['I'] 1 >>>tep['I'] = 0 >>>tep['I'] 1 >>>tep['X'] = 5 >>>tep {'I':0,'R':2,'O':3,'N':4,'X':5}注意事项
>>>demo = {"蜘蛛侠":"death","蜘蛛侠":"live"} >>>demo "蜘蛛侠":"live" #同一个键出现被赋值两次,取后者 >>>demo = {(1,2,3):"a,b,c"} >>>demo {(1,2,3):"a,b,c"} #元组不可变,可行 >>>demo = {[1,2,3]:"a,b,c"} error #报错,因为键不可变而列表可变有别于序列,字典是不支持拼接和重复操作的
设 a,b 是字典 c = a + b error #报错 d = a * 3 error #报错集合在python中的最大的特点就是:无序
区分集合 和 字典 >>>num = {} >>>num2 = {0,1,2} >>>type(num) <class 'dict'> #字典类型 >>>type(num2) <class 'set'> #集合类型创建集合
可以直接创建,也可以用set()函数 >>>set1 = {1,2,3,4,5} >>>set2 = {set[1,2,3,4,5]} >>>set1 == set2 True集合的唯一性
>>>list1 = [1,2,3,4,5,4,3,2,1,0] >>>set1 = set(list1) >>>set1 {0,1,2,3,4,5} #元素是唯一的访问集合 其实集合具有无序性、只是每次都按顺序排好罢了,所以不能使用下标法进行索引
可以用for语句、成员操作符、add()函数 >>>set1 = {1,2,3,4,5} >>>for each in set1: print(each,end = '') 12345 >>>2 in set1 True >>>set1.add('6') >>>set1 {1,2,3,4,5,'6'} #集合按照数字与浮点数(按数值)在前面,字符与字符串(按ASCII码)在后面的顺序自动排列 >>>set1.remove('6') >>>set1 {1,2,3,4,5}不可变集合
>>>set1 = frozenset({1,2,3,4,5}) >>>set1.add(6) error #报错,因为集合属于frozen(冰冻的),所以是不可变的举例(1)
def a(): ... return 123a是函数的名称,其中也可以用 中文 作为函数的名称 . . . 里的内容称为函数体,函数体里面有函数的内容,也可以有函数文档(后面讲) return 即代表函数的结束,后面可以接任何东西
举例(2)
def 多参数(x,y): return x[0]*x[1] - y[0]*y[1] input:多参数((3,4)(1,2)) output:10多参数(x,y)里的是形参,多参数((3,4)(1,2))里的是实参
举例(3)
def hello(): """打印你好 就是楼下的hello!""" print("Hello!") input: hello() output: Hello! input: print(hello()) output: Hello! None用三个引号围起来的是函数文档 自定义函数时可以不加 return 值 用 print 打印此函数会返回函数内容和 None 是因为print有个特性:打印没有 return 值的函数时会多返回一个None
举例(4)
def a(): '''我的梦想是 世界和平''' return input: print(a.__doc__) output: a(): 我的梦想是 世界和平 input: help(a) output: 我的梦想是 世界和平return 值也可以什么都没有 这两种方式都是查看函数文档,区别在于第一种多打印了函数名称,第二种的下面多了一个缩进符号
此函数的 name 是位置参数,age 和 tall 是关键字参数(即默认参数) 定义参数时位置参数一定要在关键字参数前面 当只输入位置参数时,关键字参数会默认输出 当按顺序输入关键字参数时,关键字参数值会随之而变 当按关键字参数输入时,关键字参数值会随之而变(注意位置参数一定要在关键字参数前面)
之前讲过字典的打包与解包,这次讲讲元组的
def test(*params, extra): print("收集的参数是:", params) print("位置参数:", extra) input: test(1,2,3,4,5) output: error #报错 input: test(1,2,3,4, extra = 5) output: 收集的参数是:(1,2,3,4) 位置参数:5要收集参数只需要在定义时为参数加个 * 号
在形参中 * 号是打包(pack)成元组,而在实参中是解包(unpack) 如:
tuple1 = (1,2,3,4,5) str1 = "12345" list1 = [1,2,3,4,5] print(*tuple1);print(*str1);print(*list1) output: 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5在代码片中复习
b = 3 #全局变量 def a(): b = 12 #局部变量 return b #返回局部变量 input:print(b) output:13 #打印全局变量 input:print(a()) output: 12 #打印局部变量 None #print的特性虽然全局变量和局部变量同名(python允许),但是它们的作用域不一样,全局变量位于全局作用域,而局部变量位于局部作用域,当程序进入局部作用域并遇到与全局变量同名的局部变量时,会自动屏蔽全局变量,称为 shadowing
若要在局部函数里修改全局变量的值,则用 global 关键字,用法如下:
b = 3 def a(): global b b = 12 return b input:print(b) output: 3 input:a() output:12 input:print(b) output:12 #全局变量发生改变global 关键字的作用:使局部函数具有改变全局变量的权限。一旦使用,全局变量的值就会随之发生改变
类似的,还可以建立内联函数,即函数里有函数
def fun(): #外部函数 temp = 2 #外部变量 def a(): #内部函数 temp = 13 #内部变量 print(temp) return "Hello!" print(temp) return a() #返回内部函数 input:fun() output: 2 #打印外部函数 13 #打印内部变量 Hello! #返回内部函数 return 值同理,内部变量位于内部作用域(即内部函数里),外部变量位于外部作用域(即外部函数里),但都属于局部变量
一、外部变量可访问全局变量,但全局变量不可访问外部变量 二、内部变量和全局变量互相都不可访问 三、内部函数可访问外部函数,但外部函数不可访问内部函数
既然可以用 global 关键字在局部函数里修改全局变量的值,那么是否有关键字能在内部函数改变外部函数的变量的值(注意不是修改全局变量的值)呢?当然有,就是 nonlocal 关键字,且用法和 global 关键字是一样的,所以我就不详细说明了
补充:如果在一个内部函数里对在外部作用域的变量(外部变量)进行引用,则这个内部函数就是一个闭包,故a()函数就是一个闭包
那么除了 nonlocal 关键字还有说明办法能实现闭包呢?也有,利用的是堆栈的原理(了解就行
def fun(): x = [5] #将数字 5 放入X列表中 def a(): x[0] = x[0] + 1 #X列表中的第一个元素的值(就是 5)加一 return x[0] #返回X列表中的第一个元素的值 return a() input:fun() output:6这是因为容器类型(列表)不是属于栈里的,而在栈里的变量才会被屏蔽,所以 x 不会被屏蔽
那么如何调用含参数的内联函数呢?如下:
def fun(x): def a(y): return (x * y) return a #记住要返回内部函数名 input:fun(2)(3) output:6 input:temp = fun(3) temp(2) output:6这两种写法都可以(其实性质都一样
lambda
这是函数 def g(x): return 2 * x + 1 这是lambda #两种效果是一样的 g = lambda x : 2 * x + 1 >>>g(5) #调用 lambda 11 多参数 g = lambda x, y : x + y >>>g(3, 4) 7 闭包 def g(x): return lambda : x * y >>>g(2)(3) 6filter() 相当于一个过滤器,将 True 的筛选出来
函数原型 class filter(object) filter(function or None,iterable) --> filter objectiterable就是可迭代的,可以是函数,也可以是 lambda 和其他
>>>temp = filter(None, [1, 0, False, True]) >>>list(temp) [1, True] >>>def odd(x): return x % 2 >>temp = filter(odd, range(10)) >>>list(temp) [1, 3, 5, 7, 9] >>>list(filter(lambda x : x % 2, range(10))) [1, 3, 5, 7, 9]map() 在编程中,map被称为映射
函数原型 class map(object) map(func,*iterable) --> map objectfunc 即 function(函数),就是将可迭代的参数作为函数的参数进行加工
>>>list(map(lambda x : x * 2, range(10))) [0, 2, 4, 6, 8, 10] 多参数(迭代到较短的停止) >>>list(map(lambda x, y : x + y, [1, 3, 5],[2, 4, 6, 8])) [3, 9, 11]因为我在C语言有关函数的概念(2)已经写过递归了,因此我就不重复写进来了,我就写一些python专有的知识点
1、python3.8默认最大递归深度
def a(): return a() >>> a()倒数第二句话意思是上一行重复1022次,因此最大递归深度为1026层
2、设置递归深度
>>> import sys >>> sys.setrecursionlimit(10000)意为设置最大递归深度为10000层
3、递归相比迭代效率低下,因此不建议使用
我是(新手 + 弱鸡),因此在写的过程中可能也有些疏忽,若你们在阅读的过程中发现了什么问题,或者想补充些知识点,也请大家在评论区里面留言斧正,互相交流学习,我不胜感激~