在对变量类型进行转换时可以使用Python的内置函数:
# 获取到的输入为str类型
radius = input('请输入圆的半径: ')
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)
# # 水仙花数
# 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)
# 在参数名前面的*表示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内置的那些隐含标识符min
、len
等都属于内置作用域。
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
关键字来指示变量来自于嵌套作用域。
尽量减少对全局变量的使用。
全部
字典的中的items()、keys()、values()方法,参见:https://blog.csdn.net/tcc2430/article/details/86770697
其中结论有错误的地方:values()方法将字典里的每个值以字符串的形式,存储为所生成序列里的单个元素。不一定是字符串的,可以是别的,比如int等等
类和对象
面向对象的四大支柱 - 抽象 / 封装 / 继承 / 多态
属性与方法
运算符重载
类(的对象)之间的关系 - 关联 / 继承 / 依赖
继承和多态
__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
扑克牌代码:
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()。
全部
对txt、jpg、json、doc、docs、xls、xlsx、csv等的读写
全部
正则表达式:https://www.runoob.com/python3/python3-reg-expressions.html
进程就是操作系统中执行的一个程序,进程可以通过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()
TCP/IP模型:https://zhuanlan.zhihu.com/p/33797520;https://juejin.im/post/59eb06b1f265da430f313c7f
TCP服务器-TCP客户端;UDP服务器 -UDP客户端 ;电子邮件;发送短信
优先级:or asset 使用方法: 逻辑上等同于: 详情参考:https://www.cnblogs.com/hezhiyao/p/7805278.html print('A' and 'B' or 'C')
print(not 'B' and 'A' or 'X' and 'D')
# B D
2.
assert condition
if not condition:
raise AssertionError()
3.