读书笔记摘录和补充:Python - 100天从新手到大师 之1-15天未完待续

读书笔记摘录和补充:Python - 100天从新手到大师

网址:https://github.com/jackfrued/Python-100-Days

 

Day02 - 语言元素

在对变量类型进行转换时可以使用Python的内置函数:

  • int():将一个数值或字符串转换成整数,可以指定进制。
  • float():将一个字符串转换成浮点数。
  • str():将指定的对象转换成字符串形式,可以指定编码。
  • chr():将整数转换成该编码对应的字符串(一个字符)。
  • ord():将字符串(一个字符)转换成对应的编码(整数)。
# 获取到的输入为str类型
radius = input('请输入圆的半径: ')   

 Day04 - 循环结构

  • range(101)可以产生一个0到100的整数序列。
  • range(1, 100)可以产生一个1到99的整数序列。
  • range(1, 100, 2)可以产生一个1到99的奇数序列,其中的2是步长,即数值序列的增量。
  • range(5, 0, -1)可以产生一个序列[5,4,3,2,1]。
import random
print(random.randint(1,10))        # 产生 1 到 10 的一个整数型随机数  
print(random.random())             # 产生 0 到 1 之间的随机浮点数
print(random.uniform(1.1,5.4))     # 产生  1.1 到 5.4 之间的随机浮点数,区间可以不是整数
print(random.choice('tomorrow'))   # 从序列中随机选取一个元素
print(random.randrange(1,100,2))   # 生成从1到100的间隔为2的随机整数
a = [1,3,5,6,7]
random.shuffle(a)                  # 将序列中的元素顺序打乱
print(a)

Day05 - 构造程序逻辑

# # 水仙花数
# for i in range(100,1000):
#     single = i % 10
#     ten = i % 100 //10
#     hundred = i // 100
#     if single**3+ten**3+hundred**3==i:
#         print(i)

# # 完全数/完美数
# for i in range(1,1000):
#     sum = 0
#     for factor in range(1,i):
#         if i%factor==0:
#             sum += factor
#     if sum==i:
#         print(i)

# # 百钱百鸡
# for i in range(20+1):
#     for j in range(33+1):
#         if i*5+j*3+(100-i-j)/3==100:
#             print(i,j,100-i-j)

# # 斐波那契数列
# list = [1,1]
# for i in range(2,50):
#     list.append(list[i-1]+list[i-2])
# print(list)

 Day06 - 函数和模块的使用

# 在参数名前面的*表示args是一个可变参数
# 即在调用add函数时可以传入0个或多个参数
def add(*args):
    total = 0
    for val in args:
        total += val
    return total

print(add())
print(add(1))
print(add(1, 2))

Python查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和“内置作用域”的顺序进行搜索,前三者我们在上面的代码中已经看到了,所谓的“内置作用域”就是Python内置的那些隐含标识符minlen等都属于内置作用域。

def foo():
    a = 200
    print(a)  # 200

a = 100
foo()
print(a)  # 100

在调用foo函数后,我们发现a的值仍然是100,这是因为当我们在函数foo中写a = 200的时候,是重新定义了一个名字为a的局部变量,它跟全局作用域的a并不是同一个变量,因为局部作用域中有了自己的变量a,因此foo函数不再搜索全局作用域中的a。如果我们希望在foo函数中修改全局作用域中的a,代码如下所示。

def foo():
    global a
    a = 200
    print(a)  # 200

a = 100
foo()
print(a)  # 200

我们可以使用global关键字来指示foo函数中的变量a来自于全局作用域,如果全局作用域中没有a,那么下面一行的代码就会定义变量a并将其置于全局作用域。同理,如果我们希望函数内部的函数能够修改嵌套作用域中的变量,可以使用nonlocal关键字来指示变量来自于嵌套作用域。

尽量减少对全局变量的使用。

Day07 - 字符串和常用数据结构

全部

字典的中的items()、keys()、values()方法,参见:https://blog.csdn.net/tcc2430/article/details/86770697

其中结论有错误的地方:values()方法将字典里的每个值以字符串的形式,存储为所生成序列里的单个元素。不一定是字符串的,可以是别的,比如int等等

Day08 - 面向对象编程基础

类和对象

面向对象的四大支柱 - 抽象 / 封装 / 继承 / 多态

属性与方法

运算符重载 

类(的对象)之间的关系 - 关联 / 继承 / 依赖

继承和多态

Day09 - 面向对象进阶

@property装饰器

  • getter方法:@property访问器;
  • setter方法:@attribute.setter修改器

__slots__魔法

__slots__的限定只对当前类的对象生效,对子类并不起任何作用。

class Person(object):
    # 限定Person对象只能绑定_name, _age和_gender属性
    __slots__ = ('_name', '_age', '_gender')

静态方法和类方法

例如我们定义一个“三角形”类,我们可以先写一个方法来验证三条边长是否可以构成三角形,这个方法很显然就不是对象方法,因为在调用这个方法时三角形对象尚未创建出来(因为都不知道三条边能不能构成三角形),所以这个方法是属于三角形类而并不属于三角形对象的。

class Triangle(object):

    def __init__(self, a, b, c):
        self._a = a
        self._b = b
        self._c = c

    @staticmethod
    def is_valid(a, b, c):
        return a + b > c and b + c > a and a + c > b

def main():
    a, b, c = 3, 4, 5
    # 静态方法和类方法都是通过给类发消息来调用的
    if Triangle.is_valid(a, b, c):
        t = Triangle(a, b, c)

和静态方法比较类似,Python还可以在类中定义类方法,类方法的第一个参数约定名为cls,它代表的是当前类相关的信息的对象(类本身也是一个对象,有的地方也称之为类的元数据对象),通过这个参数我们可以获取和类相关的信息并且可以创建出类的对象,代码如下所示

class Clock(object):
    """数字时钟"""

    def __init__(self, hour=0, minute=0, second=0):
        self._hour = hour
        self._minute = minute
        self._second = second

    @classmethod
    def now(cls):
        ctime = localtime(time())
        return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec)

def main():
    # 通过类方法创建对象并获取系统时间
    clock = Clock.now()

Python从语法层面并没有像Java或C#那样提供对抽象类的支持,但是我们可以通过abc模块的ABCMeta元类和abstractmethod包装器来达到抽象类的效果,如果一个类中存在抽象方法那么这个类就不能够实例化(创建对象)

from abc import ABCMeta, abstractmethod

class Pet(object, metaclass=ABCMeta):
    """宠物"""

    def __init__(self, nickname):
        self._nickname = nickname

    @abstractmethod
    def make_voice(self):
        """发出声音"""
        pass

扑克牌代码:

  • property这个装饰器的一个作用就是把函数以属性的形式返回;
  • poker的next属性。不加property时,next是一个函数,使用时用p.next()。如果加property,就是直接用属性值p.next。
  • sort
def arrange(self):
    self._cards_on_hand.sort(key=lambda card:(card.face,card.suite))
player.arrange()

def arrange(self, card_key):
    self._cards_on_hand.sort(key=card_key)
def get_key(card):
    return (card.suite, card.face)
player.arrange(get_key)

工资代码:

  • isistance() 与 type() 区别:type() 不会认为子类是一种父类类型,不考虑继承关系。isinstance() 会认为子类是一种父类类型,考虑继承关系。如果要判断两个类型是否相同推荐使用 isinstance()。

Day11 - 文件和异常

全部

对txt、jpg、json、doc、docs、xls、xlsx、csv等的读写

  • jpg:with open('0.jpg', 'rb') as f:
  • json:
  • doc/docs:参考textract、doc2text
  • xlsx:参考XlsxWriter
  • csv:

Day12 - 字符串和正则表达式

全部

正则表达式:https://www.runoob.com/python3/python3-reg-expressions.html

Day13 - 进程和线程

进程就是操作系统中执行的一个程序,进程可以通过fork或spawn的方式来创建新的进程来执行其他的任务,不过新的进程也有自己独立的内存空间,因此必须通过进程间通信机制(IPC,Inter-Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存区等。

一个进程还可以拥有多个并发的执行线索,简单的说就是拥有多个可以获得CPU调度的执行单元,这就是所谓的线程。由于线程在同一个进程下,它们可以共享相同的上下文,因此相对于进程而言,线程间的信息共享和通信更加容易。当然在单核CPU系统中,真正的并发是不可能的,因为在某个时刻能够获得CPU的只有唯一的一个线程。

是否采用多任务的第二个考虑是任务的类型,可以把任务分为计算密集型和I/O密集型。当任务为计算密集型时,采用多进程。当任务为I/O密集型时,采用多进程或多线程或两者结合。

多进程:https://morvanzhou.github.io/tutorials/python-basic/multiprocessing/

单线程+异步I/O     ????????????

建议在if __name__ == '__main__':内使用多线程多进程,如下例子,如果不if __name__ == '__main__':内使用,没法修改num和arr的值,还会报错误。

from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.14
    a[0] = 5
    print(n, a)

def main():
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print(num.value)
    print(arr[:])

if __name__ == "__main__":
    main()

Day14 - 网络编程入门和网络应用开发

TCP/IP模型:https://zhuanlan.zhihu.com/p/33797520;https://juejin.im/post/59eb06b1f265da430f313c7f

TCP服务器-TCP客户端;UDP服务器 -UDP客户端 ;电子邮件;发送短信

其它:

1.

优先级:or

print('A' and 'B' or 'C')
print(not 'B' and 'A' or 'X' and 'D')
# B D

2.

asset 使用方法:

assert condition

 逻辑上等同于:

if not condition:
    raise AssertionError()

详情参考:https://www.cnblogs.com/hezhiyao/p/7805278.html

3.

 

你可能感兴趣的:(工具)