2020-07-19 云留校学习知识杂烩(Week 1)

视觉设计-王晓豪

Python


格式化

1. %c-----以ASCII码的格式输出

2. %s-----以字符串的格式输出

3. %d-----以整数的格式输出

4. %o-----以无符号八进制的格式输出

5. %x-----以无符号十六进制的格式输出

6. %X-----以无符号十六进制的格式输出(大写)

7. %f------以实数的格式输出,可指定小数点后的精度(例: print('%.2f''%变量):以保留2位小数的格式输出变量)

8. %e-----以科学计数法输出实数(默认保留6位小数)

9. %E-----同上

10. %g-----根据实数大小自动决定使用%f或%e来输出实数

11. %G-----同上(%F或%E)


字符串的方法

capitalize()

把字符串的第一个字符改为大写

casefold()

把整个字符串的所有字符改为小写

center(width)

将字符串居中,并使用空格填充至长度 width 的新字符串

count(sub[, start[, end]])

返回 sub 在字符串里边出现的次数,start 和 end 参数表示范围,可选。

encode(encoding='utf-8', errors='strict')

以 encoding 指定的编码格式对字符串进行编码。

endswith(sub[, start[, end]])

检查字符串是否以 sub 子字符串结束,如果是返回 True,否则返回 False。start 和 end 参数表示范围,可选。

expandtabs([tabsize=8])

把字符串中的 tab 符号(\t)转换为空格,如不指定参数,默认的空格数是 tabsize=8。

find(sub[, start[, end]])

检测 sub 是否包含在字符串中,如果有则返回索引值,否则返回 -1,start 和 end 参数表示范围,可选。

index(sub[, start[, end]])

跟 find 方法一样,不过如果 sub 不在 string 中会产生一个异常。

isalnum()

如果字符串至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False。

isalpha()

如果字符串至少有一个字符并且所有字符都是字母则返回 True,否则返回 False。

isdecimal()

如果字符串只包含十进制数字则返回 True,否则返回 False。

isdigit()

如果字符串只包含数字则返回 True,否则返回 False。

islower()

如果字符串中至少包含一个区分大小写的字符,并且这些字符都是小写,则返回 True,否则返回 False。

isnumeric()

如果字符串中只包含数字字符,则返回 True,否则返回 False。

isspace()

如果字符串中只包含空格,则返回 True,否则返回 False。

istitle()

如果字符串是标题化(所有的单词都是以大写开始,其余字母均小写),则返回 True,否则返回 False。

isupper()

如果字符串中至少包含一个区分大小写的字符,并且这些字符都是大写,则返回 True,否则返回 False。

join(sub)

以字符串作为分隔符,插入到 sub 中所有的字符之间。

ljust(width)

返回一个左对齐的字符串,并使用空格填充至长度为 width 的新字符串。

lower()

转换字符串中所有大写字符为小写。

lstrip()

去掉字符串左边的所有空格

partition(sub)

找到子字符串 sub,把字符串分成一个 3 元组 (pre_sub, sub, fol_sub),如果字符串中不包含 sub 则返回 ('原字符串', '', '')

replace(old, new[, count])

把字符串中的 old 子字符串替换成 new 子字符串,如果 count 指定,则替换不超过 count 次。

rfind(sub[, start[, end]])

类似于 find() 方法,不过是从右边开始查找。

rindex(sub[, start[, end]])

类似于 index() 方法,不过是从右边开始。

rjust(width)

返回一个右对齐的字符串,并使用空格填充至长度为 width 的新字符串。

rpartition(sub)

类似于 partition() 方法,不过是从右边开始查找。

rstrip()

删除字符串末尾的空格。

split(sep=None, maxsplit=-1)

不带参数默认是以空格为分隔符切片字符串,如果 maxsplit 参数有设置,则仅分隔 maxsplit 个子字符串,返回切片后的子字符串拼接的列表。

splitlines(([keepends]))

在输出结果里是否去掉换行符,默认为 False,不包含换行符;如果为 True,则保留换行符。。

startswith(prefix[, start[, end]])

检查字符串是否以 prefix 开头,是则返回 True,否则返回 False。start 和 end 参数可以指定范围检查,可选。

strip([chars])

删除字符串前边和后边所有的空格,chars 参数可以定制删除的字符,可选。

swapcase()

翻转字符串中的大小写。

title()

返回标题化(所有的单词都是以大写开始,其余字母均小写)的字符串。

translate(table)

根据 table 的规则(可以由 str.maketrans('a', 'b') 定制)转换字符串中的字符。

upper()

转换字符串中的所有小写字符为大写。

zfill(width)

返回长度为 width 的字符串,原字符串右对齐,前边用 0 填充。


进制转换:

flags = True

while flags:

    nums = input('请输入一个整数(输入Q结束程序):')

    if nums != 'Q':

        num = int(nums)

        print('十进制 -> 十六进制 : %d -> 0x%x' % (nums, nums))

        print('十进制 -> 八进制 : %d -> 0o%o' % (nums, nums))

        print('十进制 -> 二进制 : %d -> ' % nums, bin(nums))

    else:

        flags = False



格式化操作符辅助指令

故名思意,就是对操作符功能进行补充定义的,一般放在操作符前面,例如m.n操作符,m是显示最小总宽度,n是小数点位数,如果字符串宽度不够时自动在字符串左侧插入空格补足,举例说明

>>> '%5d' %10

'  10'

>>> '%.7f' %1.12345678

'1.1234568'

'-'代表左对齐,即字符串内容在最左边,补足的以空格插入到右侧补足,举例说明

>>> '%-5d' %10

'10  '

而'+'则代表了在正数前面加上一个'+'号,举例说明

>>> '%+5d' %10

'  +10'

>>> '%+5d' %-10

'  -10'

>>> '%+5d' %+10

'  +10'

'#'在八进制面前显示o0,在十六进制前面显示oX或ox,举例说明

>>> '%#o' %10

'0o12'

>>> '%#x' %10

'0xa'

>>> '%#X' %10

'0XA'

'0'显示的数字前面填充'0'代替空格

>>> '%05d' %10

'00010'

>>> '%-05d' %10

'10  '

bin可以把十进制的数转换成二进制的数。

而oct则会把十进制的数字转换成八进制格式的数字,0o开头就是八进制的数字。


hex则可以把传入的十进制转换成十六进制的类型

int可以把二进制类型的数字转换成十进制的格式

同理,我们也可以把八进制和十六进制的数字进行转换



sum(a)  求和

sorted(a)    正排序

list(reversed(a))    逆排序

list(enumerate(a))    序号元组

list(zip(x,y))    拉链元组

列表、元祖和字符串列表、元祖和字符串统称为序列:

1)都可以通过索引得到每一个元素

2)默认索引值总是从0开始(当然灵活的Python还支持负数索引)

3)可以通过分片的方法得到一个范围内的元素的集合

4)有很多共同的操作符(重复操作符、拼接操作符、成员关系操作符)



list([iterable]) 把可迭代对象转换为列表 

tuple([iterable]) 把可迭代对象转换为元祖 

str(obj)  把对象转换为字符串

例如:

>>> temp = 'I love FishC.com!'

>>> list(temp)

['I', ' ', 'l', 'o', 'v', 'e', ' ', 'F', 'i', 's', 'h', 'C', '.', 'c', 'o', 'm', '!']


“迭代”的概念

所谓迭代,是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。


list.append()用法


函数

什么是BIF?
Python中的BIF就是Built-in Functions,即内置函数的意思,内置函数就是为了方便程序员快速的编写脚本程序,Python提供了很多内置函数,只需要直接调用即可,想要查看Python中的内置函数,在IDLE中输入dir(__builtins__)(注:builtins前后分别是两个下横杠)


SUM函数无视字符串




形参和实参

关键字参数

默认参数


python十进制转二进制函数????(有待解决)


python如何将输入(input)转为%d或%f



红色部分为局部变量,蓝色部分为全局变量


._doc_访问函数文档字符串

关键字参数


目标字符串出现次数


global关键字,将局部变量变为全局变量

nonlocal关键字,在嵌套函数中,在内部函数修改外部函数的局部变量


闭包


嵌套函数

不到万不得已不要使用全局变量:

统计字符串中不同参数的个数(问题:怎么输入并统计多个字符串)

lambda表达式

filter表达式(过滤)


题:用  filter  和  lambda  快速求出0-100中的3倍数


列表推导式


map表达式(映射)



.count()用法

Continue

Python continue 语句跳出本次循环,而break跳出整个循环。

continue 语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环。

continue语句用在while和for循环中。


挑战题:破解密码

要求:

我的代码:(想了一个多小时)

递归

非递归求阶乘

递归求阶乘

递归求斐波那契

迭代求斐波那契

汉诺塔


数据结构与算法

常见时间复杂度表

时间复杂度:就是说执行算法需要消耗的时间长短,越快越好。比如你在电脑上打开计算器,如果一个普通的运算要消耗1分钟时间,那谁还会用它呢,还不如自己口算呢。

空间复杂度:就是说执行当前算法需要消耗的存储空间大小,也是越少越好。本来计算机的存储资源就是有限的,如果你的算法总是需要耗费很大的存储空间,这样也会给机器带来很大的负担。

时间复杂度的计算

表示方法

我们一般用“大O符号表示法”来表示时间复杂度:T(n) = O(f(n))

n是影响复杂度变化的因子,f(n)是复杂度具体的算法。

常见的时间复杂度量级

常数阶O(1)

线性阶O(n)

对数阶O(logN)

线性对数阶O(nlogN)

平方阶O(n²)

立方阶O(n³)

K次方阶O(n^k)

指数阶(2^n)

接下来再看一下不同的复杂度所对应的算法类型。

常数阶O(1)

int a = 1;

int b = 2;

int c = 3;

我们假定每执行一行代码所需要消耗的时间为1个时间单位,那么以上3行代码就消耗了3个时间单位。那是不是这段代码的时间复杂度表示为O(n)呢 ?

其实不是的,因为大O符号表示法并不是用于来真实代表算法的执行时间的,它是用来表示代码执行时间的增长变化趋势的。

上面的算法并没有随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用O(1)来表示它的时间复杂度。

线性阶O(n)

for(i = 1; i <= n; i++) {

  j = i;

  j++;

}

看这段代码会执行多少次呢?

第1行会执行1次,第2行和第3行会分别执行n次,总的执行时间也就是 2n + 1 次,那它的时间复杂度表示是 O(2n + 1) 吗? No !

还是那句话:“大O符号表示法并不是用于来真实代表算法的执行时间的,它是用来表示代码执行时间的增长变化趋势的”。

所以它的时间复杂度其实是O(n);

对数阶O(logN)

int i = 1;

while(i < n) {

    i = i * 2;

}

可以看到每次循环的时候 i 都会乘2,那么总共循环的次数就是log2n,因此这个代码的时间复杂度为O(logn)。

这儿有个问题,为什么明明应该是O(log2n),却要写成O(logn)呢?

其实这里的底数对于研究程序运行效率不重要,写代码时要考虑的是数据规模n对程序运行效率的影响,常数部分则忽略,同样的,如果不同时间复杂度的倍数关系为常数,那也可以近似认为两者为同一量级的时间复杂度。

线性对数阶O(nlogN)

for(m = 1; m < n; m++) {

    i = 1;

    while(i < n) {

        i = i * 2;

    }

}

线性对数阶O(nlogN) 其实非常容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。

平方阶O(n²)

for(x = 1; i <= n; x++){

  for(i = 1; i <= n; i++) {

      j = i;

      j++;

    }

}

把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²) 了。

立方阶O(n³)、K次方阶O(n^k)

参考上面的O(n²) 去理解就好了,O(n³)相当于三层n循环,其它的类似。

空间复杂度计算

空间复杂度 O(1)

如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)。

int i = 1;

int j = 2;

++i;

j++;

int m = i + j;

代码中的 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)。

空间复杂度 O(n)

int[] m = new int[n]

for(i = 1; i <= n; ++i) {

  j = i;

  j++;

}

这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,后面虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)。


线性表

线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。

线性表的抽象数据类型

Operation

InitList(*L):初始化操作,建立一个空的线性表。

ListEmpty(L):判断线性表是否为空表。若为空表,返回true;否则,返回false。

ClearList(*L):将线性表清空。

GetElem(L,i,*e):将线性表L中的第i个位置的元素值,返回给e。

LocateElem(L,e):在线性表中L中查找与e相等的元素。若存在,返回元素序号;否则,返回0表示不存在。

ListInsert(*L,i,e):在线性表L中的第i个位置,插入新元素e。

ListDelete(*L,i,*e):删除线性表中的第i个元素,并用e返回其值。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容