python - 小甲鱼教学视频随笔(1-17P)

邂逅感!我觉得吧,挺好的,自己啃书就像是做预习,看视频教程就像是上课,在预习中遇到很多的问题,或者说预习后觉得自己都掌握了,又或者说,预习是平面学习,觉得都重要。
但在课上时,就会发现原来老师的思路是这样的,这些是关键或是主体,哦,这些是我没有注意过的,等等!
于是这次看小甲鱼的教程,倍速看,也没觉得落下什么,而且还捡起了好多细节知识,而且还思考了如果这样那样写的话,会怎样,总之看到了第19P,自定义函数.__doc__,书上没出现过的,我大概也没看到过的只是部分,于是又要回到啃文档上,教材、文档、教程的循环!

P4 字符串的赋值写法r"\""\"

In [18]: print(r"\\")
\\

In [19]: print(r"c\")
  File "<ipython-input-19-987bd18403e7>", line 1
    print(r"c\")
                ^
SyntaxError: EOL while scanning string literal


In [20]: print(r"c\\")
c\\

In [21]: print(r"c\\\")
  File "<ipython-input-21-904397e50c05>", line 1
    print(r"c\\\")
                  ^
SyntaxError: EOL while scanning string literal


In [22]: print(r"c\\\\")
c\\\\

今天来店里,于是啥都没有,就看小甲鱼吧,里面说到我之前查了好久才查到的一些问题的答案,于是小甲鱼的视频加入到我的教材中,他里面有句话,r""不能用\结尾。

思考不出来大佬们怎么想的,一个遗漏的bug还是有其他原因。看来两个\可以看作一组,能在r""中,甚至结尾出现,但是奇数的\就不行了!

In [24]: print(r"c\\""\\")
c\\\

In [29]: print("c\\" "a\\")
c\a\
165 µs ± 2.64 µs

In [30]: print("c\\","a\\")
c\ a\
239 µs ± 4.28 µs

In [31]: print("c\\"" a\\")
c\ a\
167 µs ± 2.9 µs

In [50]: "a""b"
Out[50]: 'ab'

嗯,一直以为print内的字符串需要用逗号连接,还能这样写。

奇妙,因为书中都是用一对双引号前后括注,所以从未思考过这个问题,但这个也只是奇淫巧计而已,因为这个只能是两个字符串间的操作,既然可以直接连起来,为何还。因为双引号和单引号吧!?

In [55]: print(r"a"r"b")
ab

P4字符串写法

In [2]: a=r"123\\""\\"

In [3]: a
Out[3]: '123\\\\\\'

In [4]: print(a)
123\\\

In [5]: print("a" "b")
ab

In [7]: print("a"+a+str(123))
a123\\\123

P6 e

e是float的表示方式之一,所以赋值时用e,变量就是float。长串数字带小数点,仅有print将变量作为一个单独的目标处理,即无其他变量或变量前后有逗号。

In [19]: a=15000000000000000000000000000000000000000

In [20]: a
Out[20]: 15000000000000000000000000000000000000000

In [21]: a=15000000000000000000000000000000000000000.0

In [22]: a
Out[22]: 1.5e+40

In [23]: print(a)
1.5e+40

In [24]: print("{}".format(a))
1.5e+40

In [25]: print("%f"%a)
15000000000000001060141952447820087689216.000000

In [38]: str(a)
Out[38]: '1.5e+40'

In [39]: print("%s"%a)
1.5e+40

其实单独逗号的变量是独属于一次print处理的:

print(a);print(a)
343 µs ± 4.84
print(a,a,sep="\n")
342 µs ± 3.95 µs
print("{0}\n{1}".format(a,a))
269 µs ± 1.32 µs

P6 True + True

In [34]: True
Out[34]: True

In [35]: True +True
Out[35]: 2

In [36]: True + False
Out[36]: 1

小甲鱼说不要这样做,但之前一个网友在评论中的作业,判断设置的密码等级如何。数字、字母、符号。虽然也有密码长度的判断吧,但关键的是这里:
仅有数字和字母其中一项,密码等级一
同时有数字、字母、符号其中两项,密码等级二
三项,密码等级三
如果判断的结果仅调用一次,即不需要调用多次而先赋值给一个变量甚至生成多个变量。那么我们直接调用其结果相加,岂不妙哉?

P7 int(float) 截断处理

P7 str=123

In [41]: str=121

In [42]: str=123

In [44]: a=0.123

In [45]: c=str(a)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-45-e8e9f0564cab> in <module>
----> 1 c=str(a)

TypeError: 'int' object is not callable

不能被赋值的仅有几个常量

In [47]: True=1
  File "<ipython-input-47-cd027a99ded3>", line 1
    True=1
    ^
SyntaxError: cannot assign to True
In [1]: temp=str

In [2]: type(temp)
Out[2]: type

In [3]: str=123

In [4]: str=temp

In [5]: str(123)
Out[5]: '123'

之前看过怎么设置help到文件,等操作,用的就是temp将type临时存放
那到底如何在str已被破坏的情况下,重新赋值呢?

P8 -10//4

In [3]: -10//4
Out[3]: -3

P8 -3**2

In [5]: -3**2
Out[5]: -9

P8 优先级

**
+1 -1
* / %
+ -
< <= >= > == !=
not and or
In [13]: -1**2
Out[13]: -1

In [18]: 2**-1
Out[18]: 0.5
In [6]: not 1 or 1
Out[6]: 1

In [7]: not 1 and 1
Out[7]: False

In [8]: 1 or 1
Out[8]: 1

In [9]: 1 or 4
Out[9]: 1

In [10]: 4 or 1
Out[10]: 4

In [11]: 1 and 5
Out[11]: 5

P9 三元操作符

此简写是python之父应对用户需求而写的

In [1]: %%timeit
   ...: x,y=4,5
   ...: if x<y:
   ...:     small=x
   ...: else:
   ...:     small=y
   ...:
73.7 ns ± 0.978 ns
In [2]: %%timeit
   ...: x,y=4,5
   ...: small=x if x<y else y
   ...:
   ...:
77.9 ns ± 1.78 ns

结果1 if bool else 结果2
当bool为True时,为结果1,反之,为结果2

效率:

In [16]: %%timeit
    ...: if True:""
    ...: else:""
    ...:
    ...:
14.1 ns ± 0.0933 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)


In [17]: %%timeit
    ...: if False:""
    ...: else:""
    ...:
    ...:
14.2 ns ± 0.119 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)


In [18]: %%timeit
    ...: "" if True else ""
    ...:
    ...:
26.4 ns ± 0.549 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [19]: %%timeit
    ...: "" if False else ""
    ...:
    ...:
33.1 ns ± 0.708 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

效率:原始True>=原始False>>三元True>>三元False

P10 断言 assert

In [45]: a=1;b=2
    ...: c="吾辈是只喵"
    ...: #我叫你一声毛猴,你敢答应不?
    ...: assert a>b,c
    ...: print("a>b很真理")
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-45-6f4f78c88ba8> in <module>
      2 c="吾辈是只喵"
      3 #我叫你一声毛猴,你敢答应不?
----> 4 assert a>b,c
      5 print("a>b很真理")

AssertionError: 吾辈是只喵

assert是一个debug用语句,但处于一个关键节点时,使用assert判断数据,如果错误,报错,报错内容为assert的可选参数,参数(变量等),将其前后共四句抛出,并有记录第几行
而在程序debug无bug后:

python -O 禁用assert
python -O -m “File” 编译源代码,不包含assert语句
220字节 不包含assert语句的编译文件大小
254字节 包含assert语句的编译文件大小

C:\Users\John>python "D:\win7\Documents\python\20200707 assert.py"
Traceback (most recent call last):
  File "D:\win7\Documents\python\20200707 assert.py", line 4, in <module>
    assert a>b,c
AssertionError: 吾辈是只喵

C:\Users\John>python -O "D:\win7\Documents\python\20200707 assert.py"
a>b很真理

C:\Users\John>python -O -m py_compile "D:\win7\Documents\python\20200707_assert.
py"

C:\Users\John>D:\win7\Documents\python\__pycache__\20200707_assert.cpython-38.op
t-1.pyc
a>b很真理

C:\Users\John>python -m py_compile "D:\win7\Documents\python\20200707_assert.py"


C:\Users\John>D:\win7\Documents\python\__pycache__\20200707_assert.cpython-38.py
c
Traceback (most recent call last):
  File "D:\win7\Documents\python\20200707_assert.py", line 4, in <module>
    assert a>b,c
AssertionError: 吾辈是只喵

P10 a,b=1,2 PASS

“” ‘’ pass,个人认为效果是一样的,而效率也差不多
而a,b=1,2(53vs33),与三元操作符一样,效率都是较低的。个人认为,这都不是原生语言,而是宏,所以效率低。他们都需要解析成原生语言的结构才进一步运算,即便他们已经编程为机器码,也免不了转成原生结构!

14.2 ns ± 0.162 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)


In [23]: %%timeit
    ...: ""
    ...:
    ...:
14.2 ns ± 0.113 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)


In [24]: %%timeit
    ...: ''
    ...:
    ...:
14.3 ns ± 0.321 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)


In [25]: %%timeit
    ...: pass
    ...:
    ...:
14.6 ns ± 0.83 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

In [26]: %%timeit
    ...: a,b=1,2
    ...:
    ...:
53.1 ns ± 0.51 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [27]: %%timeit
    ...: a=1
    ...: b=2
    ...:
    ...:
33.1 ns ± 0.0709 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)


In [28]: %%timeit
    ...: a=1;b=2
    ...:
    ...:
33.3 ns ± 0.0634 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)


In [29]: %%timeit
    ...: a=b=1
    ...:
    ...:
32.5 ns ± 0.384 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

while for 效率

In [52]: %%timeit
    ...: i=0
    ...: while i<1000:
    ...:     i+=1
    ...:
81.8 µs ± 4.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [53]: %%timeit
    ...: for i in range(1000):
    ...:     ""
    ...:
29.4 µs ± 561 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)```
## list=[变量]

```python
In [54]: a="uncle wang"

In [55]: l=[a]

In [56]: l
Out[56]: ['uncle wang']

In [60]: l=[yikesaiting]
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-60-23f5efa4d514> in <module>
----> 1 l=[yikesaiting]

NameError: name 'yikesaiting' is not defined

P12 列表的创建、插入、删除

iterable:数组(列表、元组、range(),字符串、集合等),切片,map

list(iterable)
[数值,变量,等等]

list.insert(索引,数值)
list.append(数值)
list.extend(iterable)

list.remove(数值) 仅删除遇到的第一个数值
del list[索引/切片/步进等]
del list
list.clear()

insert(self, index, object, /)
    Insert object before index.

我之所以看书发蒙,就是因为在组合数据中突然冒出四个组合数据,实际上文档中说了更多更多的数据类型。而每个数据类型有很多很多的方法,实际上要比书上讲的那些多很多。而且例子很无语的说,所以一下子进入了停滞、整理、重学的状态。数据繁杂,教材无序,内容深!
不得不说小甲鱼讲的让人没压力,没顾虑,所以学习还是需要个可以信赖的老师的,书本太死了!

P13 list1=list2+list3

In [1]: list1=[1,2,3]

In [2]: list2=[4,5,6]

In [3]: list3=list1.extend(list2)

#list1.extend(list2) 是执行操作,不是返回操作
In [4]: print(list3)
None

In [5]: list3=list1+list2

In [6]: list3
Out[6]: [1, 2, 3, 4, 5, 6, 4, 5, 6]

P13 dir(list)

其实知道,但是不常用,但为啥看小甲鱼用就这么羡慕呢

P13 list.sort(reverse=True)

In [1]: list1=[0,3,1,6,9,5,2,8,7]

In [2]: %%timeit
   ...: list1.sort()
   ...:
   ...:
173 ns ± 0.0687 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

In [3]: %%timeit
   ...: list1.sort(reverse=True)
   ...:
   ...:
279 ns ± 0.359 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [4]: %%timeit
   ...: list1.reverse()
   ...:
   ...:
81.3 ns ± 0.234 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

于是,这是一个宏!

P13 list1=list2[:]

等同于 list1=list2.copy()

In [7]: type(list1)
Out[7]: list

In [8]: type(list1.copy())
Out[8]: list

In [9]: type(list1[:])
Out[9]: list

In [10]: type(list1.reverse())
Out[10]: NoneType

P14 tuple1=() =1, =1,2,3

P14 tuple1=tuple1*8

P14 tuple1=tuple1[:5]+(数值,)+tuple[5:]

“{{{{{}}}”.format(1)

In [35]: "{{{{{}}}}}".format(1)
Out[35]: '{{1}'

在格式化状态下,"{{“表示”{",类似于"\\“表示”\"

“熊大”>“熊二” unicode_escape、UTF-8

In [43]: "熊大">"熊二"
Out[43]: True

In [44]: "熊大"<"熊二"
Out[44]: False

In [45]: ord("大")
Out[45]: 22823

In [46]: ord("二")
Out[46]: 20108

In [47]: chr(22823)
Out[47]: '大'

In [48]: chr(22824)
Out[48]: '夨'

In [49]: chr(22825)
Out[49]: '天'

InIn [50]: "熊大">"熊天"

Out[50]: False
In [51]: hex(ord("大"))
Out[51]: '0x5927'

In [55]: "大".encode(encoding="unicode_escape")
Out[55]: b'\\u5927'

In [57]: "大".encode(encoding="UTF-8")
Out[57]: b'\xe5\xa4\xa7'

于是,ord、chr等字符与二进制转换是以unicode为编码的。

但,有一个要注意,UTF-8编码是脚本的原生编码,如果将代码文件保存为unicode,直接报错:无法读取文件。
而保存为GBK等编码,需要在第一行注释,# -*- coding:GBK -*-,前提是,python能读懂第一行的话!或者说我并没有正确的写出unicode的编码的第一行。

sum(iterable, /, start=0)

sum (iterable, /,开始= 0)
返回一个“start”值(默认为0)加上一个可迭代的数字的和
当可迭代为空时,返回起始值。
这个函数是专门用于数值的
拒绝非数字类型。

sum(iterable,numbers)
sum(list/tuple/set/range,int/float/complex)

In [35]: sum((1,2,3,4),10)
Out[35]: 20

In [38]: sum("",10)
Out[38]: 10
#虽然""是字符串的标示,但这里同样可以表示空iterable

sorted(list) vs list.sort()

587:376

sorted(iterable, /, *, key=None, reverse=False)
返回一个新的列表,其中包含来自iterable的所有项目,并按升序排列。
可以提供自定义键函数来定制排序顺序和
反向标志可以设置为按降序请求结果。

list.sort(self, /, *, key=None, reverse=False)

.sort是list专署的,两者返回的都是列表,所以tuple都无法使用!

sorted vs reversed 结果 vs 标识

In [65]: l
Out[65]: [1, 2, 3]

In [66]: sorted(l)
Out[66]: [1, 2, 3]

In [67]: sorted(l,reverse=True)
Out[67]: [3, 2, 1]

In [70]: reversed(l)
Out[70]: <list_reverseiterator at 0x44a9d00>

In [72]: type(sorted(l))
Out[72]: list

In [73]: type(reversed(l))
Out[73]: list_reverseiterator

In [82]: t
Out[82]: (4, 5, 6)

In [83]: reversed(t)
Out[83]: <reversed at 0x4da2820>

In [85]: type(reversed(t))
Out[85]: reversed

sorted是个需要运算的步骤,所以他是一次次的导出结果,这个结果需要保存的地方,于是干脆就把这个最终的结果给出来了。

而reversed是一个很简单的运算,在我目前学到的知识来说,我无法看到他的源码,我只能逻辑推测:

In [91]: t
Out[91]: (4, 5, 6, 4, 5, 6, 4, 5, 6)

In [104]: %%timeit
     ...: list(t)
     ...:
     ...:
375 ns ± 0.646 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [105]: %%timeit
     ...: reversed(t)
     ...:
     ...:
287 ns ± 0.111 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [106]: %%timeit
     ...: list(reversed(t))
     ...:
     ...:
1.18 µs ± 1.61 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [108]: %%timeit
     ...: tuple(reversed(t))
     ...:
     ...:
1.13 µs ± 7.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [109]: %%timeit
     ...: tuple(reversed(t))
     ...:
     ...:
1.11 µs ± 1.04 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [110]: t=t*1000

In [111]: %%timeit
     ...: list(t)
     ...:
     ...:
25 µs ± 7.7 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [112]: %%timeit
     ...: reversed(t)
     ...:
     ...:
288 ns ± 0.196 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [113]: %%timeit
     ...: tuple(reversed(t))
     ...:
     ...:
418 µs ± 481 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)

被reversed的对象长度并没影响reversed的时间,于是推测,reversed只是个标记,标志着这里有个运算,如果有可转化其运算为:
| reversed(sequence, /)
|
| Return a reverse iterator over the values of the given sequence.
iterable的,操作对象是序列,操作内容为标识,遇到特定可转化类型,才会激发运算。

reversed enumerate zip

enumerate:ex nume(ral) rate 拿出数字的序列,枚举

In [117]: enumerate(t)
Out[117]: <enumerate at 0x51044a8>

In [118]: %%timeit
     ...: enumerate(t)
     ...:
     ...:
410 ns ± 1.36 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [119]: %%timeit
     ...: list(enumerate(t))
     ...:
     ...:
1.39 ms ± 15.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [120]: %%timeit
     ...: zip(range(len(t)),t)
     ...:
     ...:
1.4 µs ± 28.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [121]: %%timeit
     ...: range(len(t))
     ...:
     ...:
833 ns ± 17 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值