python第一课 数据结构和算法

注: 本文是对照https://python3-cookbook.readthedocs.io/ 学习 总结笔记

1.1 解压序列复制给多个变量

问题

现在有一个包含 N 个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给 N 个变量?

解决方案

元组:元组使用小括号与列表非常相似,创建元组只需要 tup = (1,2,3,4,5,6),通过逗隔开即可;查看当前变量是否属于元组可以通过type(tup) 来获取变量类型;并且 元组也可以通过 tup = “a”,”b”,”c” 这样来实现;元组只包含一个元素,需要在元素后面添加逗号,否则会被当做运算符使用。

序列:python中的序列一般指 字符串,列表,元组。python在序列中可以进行索引、切片、加、乘、检查成员、确定最大最小元素,

字符串: python的字符串我在介绍中也说了, 通过 变量 等于 用引号包括的值即可,例如:

var = “St0n5”

列表: 和元组类似,千万不要混淆了, 通过 list = [‘ceshi1’,’ceshi2’] 来创建

接下来开始解决问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 将p赋值给变量,注意变量的数量要和序列的数量相同
# python 可以通过多变量赋值实现 同时对多个变量的赋值
>>> p =(4,5)
>>> x,y=p
>>> x
4
>>> y
5
# 接下来 放一个列表试试
>>> data = ['python','C','中国加油',52.0,(2020,2,26)]
>>> code1,code2,num1,num2,data1=data
>>> code1
'python'
>>> code2
'C'
>>> num1
'中国加油'
>>> num2
52.0
>>> data1
(2020, 2, 26)

讨论

上面展示了都是序列元素和元素一样的情况,那如果只需要其中的一部分元素 应该怎么去做,

文章中提供了一种方法是使用任意变量名占位,之后丢掉就好,

还可以通过下标来输入某个元素 也可以达到解压一部分的目的。

1.2 解压可迭代对象赋值给多个变量

问题

如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError 。 那么怎样才能从这个可迭代对象中解压出 N 个元素出来?

解决方案

容器: 把多个元素组织在一起的数据结构,当它可以用来询问某个元素是否包含在其中时,就可以理解为这是一个容器

迭代对象:很多容器都是可迭代对象,但凡是可以返回一个迭代器的对象都可称之为可迭代对象

迭代器: 它是一种带状态的对象,通过next()方法调用返回容器的下一个值,迭代器就是工厂模式的对象。

生成器: 生成器是一种特殊的迭代器,生成器可以用更少的中间变量些流式代码,此外,相比于其他容器,它能更节省内存和cpu,没有返回值,通过yield来返回

解决问题

1
2
3
4
5
6
7
8
9
10
# 解决可迭代对象的元素超过变量个数 ,可以用 * 来解决问题
>>> record = ('xss','sql','upload','xxe','download')
>>> first,*middle,last = record
>>> first
'xss'
>>> middle
['sql', 'upload', 'xxe']
>>> last
'download'
# middle 永远都是列表类型,元素为空也是如此, 并且 * 表达式 可以用在任何位置。

扩展的迭代语法是为了解压不确定个数或者任意个数的元素的可迭代对象设计的,通常可迭代对象都是有一定规律的, 有时 *表达式也可以用来做字符串的分割,

1
2
3
4
5
6
7
8
9
>>> line = 'nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false'
>>> uname, *fields, homedir, sh = line.split(':')
>>> uname
'nobody'
>>> homedir
'/var/empty'
>>> sh
'/usr/bin/false'
>>>

当然,如果你想要的解压一些元素并丢弃他们,你可以用*_这样来表示废弃

未完待续 …


参考链接:

https://foofish.net/iterators-vs-generators.html

https://python3-cookbook.readthedocs.io/zh_CN/latest/c01/p02_unpack_elements_from_iterables.html

相关文章
评论
分享
  • python 入门简介

    python 简介为了完成毕设 努力学习python python 是一种解释型语言 pyhton 是交互式语言 python是面向对象语言 python是初学者语言 很简单 0x01 python区分只要有python2 和py...

    python 入门简介
  • OWASP API Top 10

    OWASP API TOP 10本文搬运自:https://apisecurity.io/encyclopedia/content/owasp/owasp-api-security-top-10.htm TOP1:2019 —破碎的对...

    OWASP API Top 10
  • jni函数hook

    jni函数hook(计算 地址方式)12345678910111213141516171819202122232425262728293031323334353637function hookTest9() { Jav...

    jni函数hook
  • Hook jni 主动调用

    Hook jni 主动调用要对hellofromc 进行主动调用,修改返回值,但是这里不能直接通过replace去修改返回值,而是要通过newstringutf 去修改返回值。 1234567891011121314151617181...

    Hook jni 主动调用
  • Hook 计算非导出函数地址

    hook 读写内存数据对string字符串,可能是加密的,可以通过直接hook 加载的内存数据来读取解密状态的字符串 123456789读取内存字符串数据function hookTest7() { var soAdd...

    Hook 计算非导出函数地址
  • Hook 获取指针参数的返回值

    Hook 获取指针参数的返回值在c语言中,一般都会以指针传递返回的值 ,没有return 或者return为true hook sub_750 打印参数和输出 12345678910111213141516171819functio...

    Hook 获取指针参数的返回值
  • Hook 导出函数和修改函数参数返回值

    Hook 导出函数123456789101112131415161718192021222324252627282930// hook 导出函数function hookTest1() { var addAddr =...

    Hook 导出函数和修改函数参数返回值
  • Hook dlopen

    hook dlopen在刚开始hook 我们必须使得app加载so 才能hook, 我们可以hookdlopen 获取到so在那加载,在高版本中有一些so会走android_dlopen_ext 1234567891011121314...

    Hook dlopen
  • Hook Java层通杀

    Hook 通杀Hook 普通方法和修改函数参数返回值fradaserver 是手机端的, android低版本 frida 尽量低版本 fridaserver版本要与frida库版本一致 不同平台用不同fridaserver 不要和...

    Hook Java层通杀
  • Hook so 导入导出表

    hook so 导入导出表启动frida打开两个cmd 窗口 12345第一个cmd窗口adb shellsucd /data/local/tmp./fx // 这个是frida-server-12.8.14-android-x86...

    Hook so 导入导出表
Please check the comment setting in config.yml of hexo-theme-Annie!