知识点1:深拷贝和浅拷贝

  • 非拷贝(=赋值:数据完全共享,内存地址一样,修改一个另一个也变化)
  • 浅拷贝:数据半共享(复制其数据独立内存存放,但是只拷贝成功第一层)像[[1,2],3,4]如果修改列表中列表[1,2]的值则会一起修改
  • 深拷贝:数据完全不共享(复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享)

知识点2:set集合

  • 去重功能,集合本身无序、不重复,所以不能通过索引和键进行取值,集合对象是无序可哈希(不可改变)的值(也就是说对于set([[1,2],3,4])是不行的,因为列表里面中还包含了列表(可改变的值),所以会出现set失败)
  • 空集合(set()),而{}是字典,集合分可变和不可变(frozenset),一般我们说的都是可变的,由于可变,所以set()本身就是不可哈希的,因此不能作为字典的key
  • 创建集合:set("liu")就是{'l', 'i', 'u'}且类型为set,注意虽然是大括号但是不是字典类型
  • 访问集合:由于集合本身的无序,所以不能使用索引、切片等访问,只能通过循环遍历访问或者in not in去判断是否是集合元素
  • 集合添加元素:add方法和update,详情如下
  • s = set("liu")
    s.add("ta") #添加一个元素'ta'
    s.update("za") #添加两个元素,'z'和'a'
    s.update(["",""]) #添加两个元素'34'和'12' print(s)
    结果:
    {'ta', 'l', 'u', 'a', '12', 'z', 'i', '34'}
  • 集合元素删除:remove(元素)删除指定元素,pop()随机删除集合元素,s.clear()清空集合元素,剩下一个空集合,del s(删除集合,删除后s就不存在了)
  • 集合类型操作:
s1 = {"a", "b", "c"}
s2 = {"c", "d", "e"} # 交集
# 两个集合中的共有元素
print(s1 & s2) # {'c'}
print(s1.intersection(s2)) # {'c'} # 并集(联合)
print(s1 | s2) # {'e', 'd', 'b', 'a', 'c'}
print(s1.union(s2)) # {'e', 'd', 'b', 'a', 'c'} # 差集
print(s1 - s2) # {'a', 'b'}
print(s1.difference(s2)) # {'a', 'b'} # 反交集(对称差集)
print(s1 ^ s2) # 两个集合中单独存在的数据 {'e', 'a', 'd', 'b'}
print(s1.symmetric_difference(s2)) # 两个集合中单独存在的数据 {'e', 'a', 'd', 'b'} s1 = {"a", "b"}
s2 = {"a", "b", "c"} # 子集
print(s1 < s2) # set1是set2的子集吗? True
print(s1.issubset(s2))
# 超集(父级)
print(s1 > s2) # set1是set2的超集吗? False,s2是s1的超集
print(s1.issuperset(s2))

知识点3:函数

  • 必需参数(以正确的顺序传入函数。调用时的数量必须和声明时的一样。类似f(name, age),传入的时候这样f("liu", 18)
  • 关键字参数(使用关键字参数允许函数调用时参数的顺序与声明时不一致。类似f(name, age),传入的时候这样f(age=18, name="liu")
  • 缺省参数(调用函数时,缺省参数的值如果没有传入,则被认为是默认值。类似f(name, age = 18),传入的时候这样f(name="liu"),而age为默认参数
  • 不定长参数(加了星号(*)的变量名会存放所有未命名的变量参数。而加(**)的变量名会存放命名的变量参数,*args会将参数存成元祖,**kwargs会将参数存放成字典)

1、总结四种参数位置优先级:必需参数和关键字参数放最左边,缺省(默认参数)第二位,不定长参数放第三位(**args放在左边,**kwargs参数放在右边)

2、函数注意点:

  1. 函数内没有return,默认返回None
  2. 如果return多个对象,python会自动帮我们将多个对象封装成元祖返回
  3. test(*args)中* 的作用其实就是把序列 args 中的每个元素,当作位置参数传进去。比如上面这个代码,如果 args 等于 (1,2,3) ,那么这个代码就等价于 test(1, 2, 3)
  4. test(**kwargs)中** 的作用则是把字典 kwargs 变成关键字参数传递。比如上面这个代码,如果 kwargs 等于 {'a':1,'b':2,'c':3} ,那这个代码就等价于 test(a=1,b=2,c=3)

3、python中的作用域分4种情况:

  • L:local,局部作用域,即函数中定义的变量;
  • E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
  • G:globa,全局变量,就是模块级别定义的变量;
  • B:built-in,系统固定模块里面的变量,比如int, bytearray等。 搜索变量的优先级顺序依次是:局部作用域>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB

当内部作用域想修改外部作用域的变量时,就要用到globalnonlocal关键字了,当修改的变量是在全局作用域(global作用域)上的,就要使用global先声明一下,而nonlocal关键字是修改嵌套作用域(enclosing作用域,外层非全局作用域)

4、函数小结:

(1)变量查找顺序:LEGB,局部作用域>外层作用域>当前模块中的全局>python内置作用域;

(2)只有模块、类、及函数才能引入新作用域;

(3)对于一个变量,内部作用域先声明就会覆盖外部变量,不声明直接使用,就会使用外部作用域的变量;

(4)内部作用域要修改外部作用域变量的值时,全局变量要使用global关键字,嵌套作用域变量要使用nonlocal关键字。nonlocal是python3新增的关键字,有了这个 关键字,就能完美的实现闭包了。

一个有趣的函数例子:

def outer():
def inner():
return 1
return inner #返回inner的内存地址
a = outer #将outer的内存地址赋值了给a
print(a()) #相当于outer(),结果实际上是返回了inner的内存地址
print(a()()) #这里打印了结果1,因为执行了inner,所以返回了1

5、函数的递归

定义:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

其实函数的递归最典型的就是斐波那契数列(1、1、2、3、5、8.。。),下面是这个的例子

u'''斐波那契数列(1、1、2、3、5、8.。。)'''
#第一种:循环方式实现
def feibo1(n):
if n <= 1:
return n
first_num = 0
second_num = 1
for i in range(n-1):
sum1 = first_num + second_num
first_num = second_num
second_num = sum1
return sum1 #第二种:递归方式实现
def feibo2(n):
if n <= 1:
return n
return feibo2(n-1) + feibo2(n-2)

递归函数的优点:    是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。

递归特性:

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。)

6、重要的内置函数

filter(function, sequence)     对sequence中的item依次执行function(item),将执行结果为True的item做成一个filter object的迭代器返回。可以看作是过滤函数。

list1 = [1, 2, 3, 4]

def fun(str1):
if str1 != 3:
return str1 result = filter(fun, list1) #主要是过滤作用,返回结果为True的值
print(list(result)) -->结果是[1, 2, 4]

  2 map(function, sequence)       对sequence中的item依次执行function(item),将执行结果组成一个map object迭代器返回,当然map也支持多个sequence,这就要求function也支持相应数量的参数输入。

list1 = ["a", "b", "c"]

def fun1(str):
return str + "test" result1 = map(fun1, list1) #注意下面map和filter区别,如果没条件过滤,filter后还是返回本身
result2 = filter(fun1, list1)
print(list(result1)) #结果是['atest', 'btest', 'ctest']
print(list(result2)) #结果是['a', 'b', 'c']
def add1(x,y):    #多个sequence的情况
return x+y
print (list(map(add1, range(10), range(10))))##[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

  3 reduce(function, sequence, starting_value)     对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用.

from functools import reduce

def fun1(x, y):
return x*y result = reduce(fun1, range(1, 6)) # 通过reduce就直接实现了阶乘,注意下,这里reduce的结果就是一个值而不是迭代器
print(result)

  4 lambda 匿名函数

像上面reduce实现的阶乘,这里通过匿名函数再实现,对比下两者:

from functools import reduce
result = reduce(lambda x, y: x*y, range(1, 6)) #匿名函数的命名规则,用lamdba 关键字标识,冒号(:)左侧表示函数接收的参数(x,y) ,冒号(:)右侧表示函数的返回值(x*y)
print(result)

Python全栈开发记录_第四篇(集合、函数等知识点)的更多相关文章

  1. Python全栈开发记录_第三篇(linux(ubuntu)的操作)

    该篇幅主要记录linux的操作,常见就不记录了,主要记录一些不太常用.难用或者自己忘记了的点. 看到https://www.cnblogs.com/resn/p/5800922.html这篇幅讲解的不 ...

  2. Python全栈开发记录_第十篇(反射及选课系统练习)

    反射机制:反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块中寻找指定函数,对其进行操作.也就是利用字符串的形式去对象(模块)中操作(查找or获取or删除or添加)成员,一种基于字符串的事件 ...

  3. Python全栈开发记录_第八篇(模块收尾工作 json & pickle & shelve & xml)

    由于上一篇篇幅较大,留下的这一点内容就想在这里说一下,顺便有个小练习给大家一起玩玩,首先来学习json 和 pickle. 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过, ...

  4. Python全栈开发记录_第七篇(模块_time_datetime_random_os_sys_hashlib_logging_configparser_re)

    这一篇主要是学习python里面的模块,篇幅可能会比较长 模块的概念:在Python中,一个.py文件就称之为一个模块(Module). 模块一共三种: python标准库 第三方模块 应用程序自定义 ...

  5. Python全栈开发记录_第六篇(生成器和迭代器)

    说生成器之前先说一个列表生成式:[x for x in range(10)]   ->[0,1,2....,9]这里x可以为函数(因为对python而言就是一个对象而已),range(10)也可 ...

  6. Python全栈开发记录_第五篇(装饰器)

    单独记录装饰器这个知识点是因为这个知识点是非常重要的,必须掌握的(代码大约150行). 了解装饰器之前要知道三个知识点 作用域,上一篇讲到过顺序是L->E->G->B 高阶函数: 满 ...

  7. Python全栈开发记录_第一篇(循环练习及杂碎的知识点)

    Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(该篇代码行数大约:300行) 知识点1:优先级:not>and 短路原则:a ...

  8. Python全栈开发记录_第九篇(面向对象(类)的学习)

    有点时间没更新博客了,今天就开始学习类了,今天主要是面向对象(类),我们知道面向对象的三大特性,那就是封装,继承和多态.内容参考该博客https://www.cnblogs.com/wupeiqi/p ...

  9. Python全栈开发记录_第二篇(文件操作及三级菜单栏增删改查)

    python3文件读写操作(本篇代码大约100行) f = open(xxx.txt, "r", encoding="utf-8") 不写“r”(只读)默认是只 ...

随机推荐

  1. CSS-图片占位的技巧

      图片占位技巧,防止动态获取图片 网络慢,页面一跳一跳的情况发生 .food .image-header {                position: relative;  width: 1 ...

  2. svg常见形状

    SVG是使用XML来描述二维图形和绘图程序的语言.是指可伸缩矢量图形(Scalable Vector Graphics),svg.图像在放大或改变尺寸的情况下图形质量不会有所损失. svg的主要竞争者 ...

  3. Java面试3

    反射的定义: 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作.例如它允许一个java的类获取它所有的成员变量和方法并且显示出来. 反射机制的 ...

  4. PHP数据库连接mysql与mysqli的区别与用法

    一.mysql与mysqli的概念相关: 1.mysql与mysqli都是php方面的函数集,与mysql数据库关联不大. 2.在php5版本之前,一般是用php的mysql函数去驱动mysql数据库 ...

  5. Cookie保存用户名和密码

    首次登录: 第二次登录: 百度网盘: 链接: https://pan.baidu.com/s/12W4B5-Bfyc_021oyVYkEJw 提取码: r55h

  6. Linux本地yum源配置以及使用yum源安装gcc编译环境

    本文档是图文安装本地yum源的教程,以安装gcc编译环境为例. 适用范围:所有的cetos,红帽,fedroa版本 适用人群:有一点linux基础的小白 范例系统版本:CentOS Linux rel ...

  7. Linux第九节课学习笔记

    fdisk可添加.删除.转换分区. 创建主分区:n-p-w:扩展分区:n-e:逻辑分区:n-l. SWAP分区专用格式化命令mkswap,专用挂载命令swapon. 磁盘容量配额中,硬限制必须,软限制 ...

  8. java-log4j日志打印

    参考路径: https://blog.csdn.net/edward0830ly/article/details/8250412 https://www.cnblogs.com/ITtangtang/ ...

  9. JavaScript中数组的应用

    Array的应用 1)创建 new Array();new Array(size);new Array(element,element,...,element); 2).Array对象属性 const ...

  10. webRTC中音频相关的netEQ(五):DSP处理

    上篇(webRTC中音频相关的netEQ(四):控制命令决策)讲了MCU模块是怎么根据网络延时.抖动缓冲延时和反馈报告等来决定给DSP模块发什么控制命令的.DSP模块根据收到的命令进行相关处理,处理简 ...