python基础

Python基础知识总结

对以前学习时做的记录翻出来做一次整合,温故而知新

一,变量

1.定义变量:
a = 10
a, b = 10, 20
a = b = c = 100# a = 1, b = 2  # 报错
a, *b, c = 1, 2, 3, 4

2.命名规范:
        a. 只能使用字母数字下划线,且不能以数字开头
        b. 不能是关键字: (False, None, True, and, as, assert, async, await, 
        	break, class, continue, def, del, elif, else, excrpt, finally,
         	for,from, global, if, import, in, is, lambda, nonlocal, not ,
         	or , pass, raise, return, try, while, with, yield)
        c. 区分大小
        d. 尽量见名知意,多单词情况下:
           i. 使用下划线:my_student_name
           ii. 使用小驼峰: myStudentName

3.删除变量
        del name

二、	运算符

1、算术运算符:+,-,*,/,%,**,//
2、赋值运算符:=,+=,-=,*=,/=,%=,**=,//=
3、关系运算符:>,>=,<,<=,=,==,!=
4、逻辑运算符:and,or,not
5、成员运算符:in,not in
6、身份运算符:is,is not
7、位运算符:&,|,~,^,<<,>>

三、	分支结构

1、单分支:if
2、双分支:if - else
3、多分支:if - elif - else
4. 类似三目运算符的语法
a = 10
b = 11
x = a if a>b else b
print(x)

四、	循环结构

1.	while循环:
2.	for循环:
3.	while-else 和 for-else
4.	循环相关的关键字
	a.	break关键字:
		i.	在循环中使用;
		ii.  break之后的代码不会执行;
		iii. break只会跳出当前这一次循环
		IV. break可以配合for - else /while - else使用
	b. continue关键字:结束当次循环直接进入下一次循环
	c. pass关键字:空语句,作用就是保证代码的一致性,防止报错
5. range的使用

五、	数据类型

6.	数据类型:
      	不可变类型/值类型/基本类型:
          	number(int,float)
          	bool: True,False
          	str: 字符串
          	tuple: 元组
          	None: 空值
          	bytes: 二进制
        
   	可变类型/引用类型:
          	list: 列表
          	dict: 字典
   			set: 集合(了解)

7.	list, dict, str
列表:
    	定义列表: ages = [1,2,3,4,5,6]
    	基本操作:
        +: 拼接 
        *: 重复
        len: 列表长度
        [:]: 切片
        index: 下标
        
 列表的方法:
    增: 
        append(n): 追加一个元素
        extend([]): 追加一个列表中的所有元素
        insert(index, n): 在指定的下标位置插入元素
    删:
        pop(index): 弹出指定下标的元素, 默认弹出最后一个元素
        remove(n): 删除指定的第一个元素
        count(n): 统计元素出现的次数
        clear(): 清空列表
        del ages[1]: 
    改:
        ages[1] = 100
    查:
        print(ages[1])
        遍历列表:
            for n in ages:
                pass
            for i in range(len(ages)):
                pass
            for i,n in enumerate(ages):
                pass
        排序:
        	升序
        		sort():  
            	sorted(): 升序,不会改变原列表,主要针对元组,字符串的排序
        	降序: 
        		sort(reverse=True)
        		sorted(list, reverse=True)
        	倒序/逆序/反转:
            	reverse(): 
            	reversed(): 倒序,不会改变原列表,主要针对元组,字符串的排序
         拷贝:
             copy(): 浅拷贝, 一般用于一维列表
             import copy
             copy.deepcopy() : 深拷贝,主要用于二维列表或多维列表.
        
字符串:
    	定义字符串:s = "hello"
    	
    	基本操作:
        +: 拼接 
        *: 重复
        len: 字符串长度
        [:]: 切片
        index: 下标
    
   字符串方法:
   
        大小写:
        	upper(): 变成大写
        	lower(): 变成小写
        	title(): 标题化(每个单词首字母大写)
        	capitalize(): 第一个字母大写,其他小写
        	swapcase(): 大小写翻转
        判断:
        	isupper(): 是否为大写
        	islower(): 是否为小写
        	isdigit(): 是否为数字
       		isalpha(): 是否为字母
        	isalnum(): 是否为字母或数字
        	istitle(): 是否为标题格式
        	isspace(): 是否只有空格
        查找:
        	find( ): 查找子字符串在长字符串中第一次出现的下标位置, 如果不存在则返回-1
        	rfind(): 和find功能类似,但是是从右往左
        下标:
        	s.index('')   字符串出现的下标,从左往右
        	s.rindex('')  字符串出现的下标,从右往左
        拆分:
        	split(): 根据分隔符取进行分割/拆分
        	splitlines(): 按行分割,等价于split('\n')
        	s.split('\n')   按行拆分
        合并:
        	join(): 跟split反过来, 拼接列表中的元素,如: "+".join(['a','b'])
        替换:
        	replace(old, new): 替换
        首尾匹配:
        	s.startswith('   ')
        	s.endswith('  ')
        编码和解码:
        	encode(): 字符串=>二进制
        	decode(): 二进制=>字符串
        去除首尾:
        	s.strip('  ')  去除首尾指定字符,默认是空格
        对齐:
        	center(): 居中
        	ljust(): 靠左
        	rjust(): 靠右
        	zfill(): 靠右,其他用0填充
        ASCII码转换:
        	ord("a")   97  char字符
        	chr(65)     ‘A’
        eval() 将字符串的内容变成表达式
        

字典:
    	定义字典:
d = {"name": "李小璐", "age": 29}
   	 基本操作:
        	len: 字典长度
    	字典的方法:
        增/改:
            d['name'] = "PGone"   
            update(): 拼接另一个字典
                如: d.update({"sex": "男"})     
        删:
            [重点]pop(k): 根据key删除元素
            popitem(): 了解, 随机删除一个元素
            clear(): 了解, 清空字典
            del d[key]: 了解
        查:
            print(d['name']): 如果key不存在会报错
            d.get('name'): 如果key不存在不会报错,会返回None
        
        遍历字典:
            for k in d:
                pass
            for k in d.keys():
                pass
            for v in d.values():
                pass    
            for k,v in d.items():
                pass
            


六、	函数

1.	函数的创建:函数名,函数体,返回值

def fn(x, y):
	print(x + y)
	return x + y

2.	函数的参数:
	a.	位置参数/必须参数,默认参数,关键字参数,不定长参数。
	b. 参数的书写顺序:def fn(x, y, *args, z=1, **kwargs):

3.	函数的返回值:return 关键字
	a、会立即终止函数/退出函数;
	b、return后面的代码不会再执行;
	c、可以返回指定的值(返回结果)

4.	匿名函数:使用lambda来创建匿名函数

f2 = lambda x: x * x
print(f2(3))   #9

f3 = lambda x, y: x + y
print(f3(4, 5))  #9

5.	函数的特殊用法:函数名既是函数的名称,也是指向函数的一个变量,也可以作为函数的参数使用。例如,回调函数:

#回调函数
#m1 是普通函数
def m1(x, f):
	# print(x, f)
	s = f(x)
	return s

#m2 是回调函数
def m2(a):
	return a + 1

#m2 是函数名,被当作参数传递给了m1
print(m1(3, m2))

6.	函数的作用域:
	a.	局部变量:在函数内部定义的变量,不可以在函数外部使用。
	b.	全局变量:在函数外部定义的变量,可以在函数内被获取,修改全局变量需要用global
	c.  局部作用域:L
	d.  函数作用域:E  nonlocal可以让内部函数修改指定的外部函数中的变量
	e.  全局作用域:G
	f.  内建作用域:B  (Python作用域)

	1.不同作用域变量的定义
	num4= int(2.9)
	num3 =  3    #G;全局作用域
	def outer():
	num2=2#E:函数作用域
	def inner():
	num1=1#L:局部作用域
   	print(num4,num3,num2,num1)
	return  inner
	f = outer()
	f()
	#注意:当所有的变量不同名的时候,在闭包中,可以任意访问四种不同作用域对应的变量

7.	函数的嵌套和闭包:
如果在一个外部函数中定义一个内部函数,并且外部函数的返回值是内部函数,就构成了一个闭包,则这个内部函数就被称为闭包【closure】

def out():
	p = 10
def inner():
	nonlocal p
	p += 1
	print('p =', p)
	return inner

8.	装饰器:
在代码运行期间,可以动态增加函数功能的方式,被称为装饰器【Decorator】

#通用装饰器
def outer2(f2):
def inner(*args, **kwargs):
	print('开始唱歌了')
	r = f2(*args, **kwargs)
	print('唱完了', r)
	return r

return inner

@outer2   #@语法糖
def sing2(singer, song, a):
	print(singer, '小红唱:', song, a)
	return 'nice'

	print(sing2('小玲', '老女孩', a=10))

9.	函数递归:
一个会调用自身的函数【在一个函数的内部,自己调用自己】

a、找临界值,递归终止的条件
b、找规律,相邻两次循环的关系,用公式表达出来

#求阶乘
# 临界值:f(1) = 1
#公式:f(n) = n*f(n-1)
def f(n):
	if n == 1:
		return 1
	return n * f(n - 1)


七、	 包和模块
1. 包:
包含__init__.py文件的文件夹, 一般用来存储模块

2. 模块:
模块就是python文件

3. 包和模块的命名规范: 
和变量命名规范一致

4. 导入包和模块
	a, import
		格式: 
		import package
		示例:  
		import math
		import os, random
	b, from-import
		格式: 
		from package import module
		from package.module import variable/function
		from module import variable/function
		示例: 
		from package import module
		from package.module import sex, login


八、	系统模块

1.	os模块
	os.listdir(): 获取指定目录下的所有文件和文件夹名称
	os.mkdir(): 创建一个目录
	os.makedirs(): 可以创建多层目录
	os.rmdir(): 删除空目录
	os.rename(): 重命名文件或目录
	os.remove(): 删除文件
	os.getcwd(): 获取当前路径
	os.curdir(): 获取当前路径,得到的是一个点.
	. 表示当前目录
	.. 表示父目录

2.	os.path模块
	os.path.abspath(): 获取到绝对路径
	os.path.join(): 拼接路径
	os.path.split(): 拆分路径/分割路径
	os.path.splittext(): 拆分文件名,比如: hello.py
	os.path.isdir(): 判断是否为目录
	os.path.isfile(): 判断是否为文件
	os.path.exists(): 判断是否存在
	os.path.getsize(): 获取文件大小
	os.path.dirname(): 父目录
	os.path.basename(): 文件名

3.	time模块
	概念: 
		UTC: 国际标准时间
	时间戳: 从1970年1月1日到指定时间的秒数
	time模块中的方法
		time.time() : 获取当前时间的时间戳
		time.sleep(): 让程序暂停
		time.gmtime(secs):时间戳=>时间元组, UTC
		time.localtime(secs): 时间戳=>时间元组, 本地时间
		time.mktime(t): 时间元组=>时间戳
		time.strftime(): 时间元组=>时间字符串
		time.strptime():  时间字符串=>时间元组
		time.asctime()
		time.ctime()

4.	datetime模块[掌握]
	a. 创建日期对象
		d = datetime.datetime.now() : 当前时间的日期对象
		d = datetime.datetime(2020, 1, 2, 10, 10, 10) : 创建指定的日期对象
	b. 日期对象的方法和属性
		d.year, d.month, d.day : 年, 月, 日
		d.hour, d.minute, d.second: 时,分,秒
		d.date(): 年月日
		d.time(): 时分秒
		d.strftime(): 输出一个格式化的时间字符串
		d.timestamp(): 时间戳
		datetime.timedelta(days=8, hours=10): 时间差

5.	calendar模块
	c = calendar.calendar(2020, w=2, l=1, c=6)
	c = calendar.month(2020, 7)
	calendar.isleap(2020)
	calendar.leapdays(1900, 2020)
	calendar.monthcalendar(2020, 7)
	calendar.monthrange(2020, 6)

6.	hashlib模块
	md5加密:
		m = hashlib.md5()
		m.update("hello".encode())
		m2 = m.hexdigest()


九、	第三方模块

安装第三方模块
1.	使用pycharm去安装
2.	使用pip命令
	pip -V  : 查看pip版本
	pip install numpy : 安装包
	pip uninstall numpy: 卸载包.
	pip list : 查看所有的包
	pip freeze: 查看自己安装的包
	pip show numpy: 查看包详情

十、	遍历目录

import os
	# 遍历目录p
def search_dir(path):
	filename_list = os.listdir(path)
	for filename in filename_list:
	# file_path: 每个子文件或子文件夹的绝对路径
	file_path = os.path.join(path, filename)

	# 如果是文件
	if os.path.isfile(file_path):
		print("文件名:", filename)
	# 如果是目录
	elif os.path.isdir(file_path):
		print("目录名:", filename)

	# 递归遍历当前目录的子目录
	search_dir(file_path)
	search_dir(r'C:\Users\ijeff\Desktop\Python2003\day11\code\newdir')

十一、	面向对象

1.	面向对象和面向过程
面向过程: 侧重解决问题的步骤, 按顺序一步一步执行, 亲力亲为.
面向对象: 侧重问题中的对象, 以指挥官的身份去使用这些对象做事情.

2.	类和对象
类: 封装属性和方法, 创建类的目的是用来创建对象, 类是对象的抽象
对象: 是类的一个具体, 我们要使用类来创建对象

3.	构造函数和析构函数
构造函数:
class A:
	def __init__(self, name):
		self.name = name
i.	创建对象时会自动调用构造函数
ii.	作用是对属性进行初始化

析构函数:
class B:
	def __del__(self):
		print("析构函数")
4.	self
	a.	self存在于类中的函数里面的形参
	b.	self不是关键字
	c.	self是指向当前类的对象, 哪个对象调用了该函数,则self就是这个对象

5.	__slots__
	限制属性的名称
	__slots__ = ("name", "age")

6.	封装
a.	私有化
	使用双下划线开头: __name
	私有化的特点: 只能在当前类内部使用
		i.	属性私有化
		ii.	方法私有化
b.	property装饰器
	作用: 让方法可以当成属性来使用
	条件: 必须要写返回值

7.	继承
a.	单继承
定义: 只有一个父类

	# 父类
class Father:
	def __init__(self, name, age):
		self.name = name
		self.age = age

	# 子类
class Son(Father):
	def __init__(self, name, age, sex):
		super().__init__(name, age)
		Father.__init__(self, name, age)
		self.sex = sex

b.	多继承
定义: 有2个或2个以上的父类

	# 父类
class Father:
	def __init__(self, name):
		self.name = name

	# 父类
class Mother:
	def __init__(self, age):
		self.age = age

	# 子类
class Son(Father, Mother):
	def __init__(self, name, age, sex):
	# Father.__init__(self, name)
	# Mother.__init__(self, age)
	super(Son, self).__init__(name)
	super(Father, self).__init__(age)
	self.sex = sex

c. 私有属性和私有方法不可以继承

d. 重写
	定义: 在继承的基础上, 子类有和父类相同的方法, 则子类重写了父类的方法

8.	__str__和__repr__
	作用: 让打印的对象值为我们__str__函数中的返回值(字符串)
	条件: 必须返回字符串类型(一般返回属性值)

9.	多态: 
	在继承的基础上,而且需要用重写. 要在父类中定义一个方法,让所有子类重写该方法,那么我们可以使用父类对象去指向不同的子类来调用同一个方法名,则有不同的状态或结果

10.	isinstance和type
	isinstance: 判断某个对象是否是某个类(父类)创建的, 返回bool值
	type: 打印某个对象的类型

11.	对象属性和类属性的区别
	对象属性: 
	调用: 对象.对象属性
	赋值: 如果属性存在则修改, 如果属性不存在则会动态添加新属性
	内存: 独立的, 每个对象的对象属性是独立的内存
	类属性:
	调用:
		1.	对象.类属性
		2.	类.类属性(推荐)
 	赋值:
		要使用类.类属性的方式赋值
	内存:
		共享的内存

12.	类方法和静态方法
 	类方法:
		@classmethod
	静态方法:
		@staticmethod
 
class Person:
	age = 10

	# 构造方法/构造函数
	def __init__(self, name):
		self.name = name

	# 成员方法(常用)
	def sleep(self):
		print("睡觉:", self)

	# 私有方法
	def __run(self):
		print("跑步")

	# 类方法:
	#   1. 可以使用类和对象调用,但是建议使用类来调用,可以节省内存
	#   2. 可以使用类属性和其他类方法, 但是不能使用对象属性和成员方法和私有方法
	#   3. 一般用在功能比较单独,和类中其他属性和方法无关的情况下
	# cls: class
@classmethod
def eat(cls):
	# print(cls.name)  # 在类方法中不能使用对象属性和成员方法,因为没有self
	print("吃饭:", cls==Person)  # True

	# 静态方法:
	#   1. 可以使用类和对象调用,但是建议使用类来调用,可以节省内存
	#   2. 不可以使用对象属性,成员方法和私有方法,一般也不用类属性和类方法
	#   3. 就是一个非常普通的函数,只是写类里面
@staticmethod
def sing():
	print("唱歌")


13.	特殊属性
__name__ : 得到类名
__class__: 打印对象所属类
__dict__: 得到所有属性组成的字典
__module__: 所在模块
__bases__: 所有父类
__mro__: 继承链

14.	运算符重载
可以让对象使用运算符

class Girl:
	def __init__(self, name, age):
		self.name = name
		self.age = age

# + 加法
def __add__(self, other):
	return self.age + other.age


	# 对象
	p1 = Girl('杨超越', 22)
	p2 = Girl('关晓彤', 20)

	print(p1.age + p2.age)
	print(p1 + p2)

15.	单例模式

# 方法一: 使用new
class Person(object):

# 构造函数: 用来对属性初始化
def __init__(self, name):
	print("__init__")
	self.name = name

	# 类属性
instance = None

	# new方法:用来创建对象
@classmethod
def __new__(cls, *args, **kwargs):
	print("__new__")
	if not cls.instance:
		print("---创建新对象---")
		cls.instance = super().__new__(cls)  # 新建对象
	return cls.instance

# 方法二: 使用装饰器
def outer(cls):
	instance = None
	print("instace初始化为None")
def inner(*args, **kwargs):
	nonlocal instance
	if not instance:
		print("---创建了新对象---")
		instance = cls(*args, **kwargs)
		print('--返回对象--')
	return instance

	return inner

@outer
class Person:
	pass

# 方法三: 使用类方法

class Singleton:
	instance = None

@classmethod
def get_instance(cls):
	if not cls.instance:
		cls.instance = cls()
	return cls.instance

s1 = Singleton.get_instance()
s2 = Singleton.get_instance()
print(s1 is s2)  # True


十二、	异常处理
1.	异常:  代码运行时可能报错
2.	捕获异常

	# 第一种写法
try:
	a =  9 / 0
except:
	print("报错了")

	# 第二种写法
try:
	a = a + 1
except NameError as e:
	print("报错了:", e)

	# 第三种写法
try:
	a = a + 1
except Exception as e:
	print("报错了:", e)

	# 第四种写法
try:
	a = a + 1
except Exception as e:
	print("报错了:", e)
else:
	print("没有出错")

	# 第五种写法
try:
	a = a + 1
except Exception as e:
	print("报错了:", e)
finally:
	print("不管有没有错误, 这里的代码都会执行")

3.	 抛出异常

raise NameError("hello")

4.	自定义异常

class MyException(Exception):
pass

5.	断言

def fn(n):
assert n!=0, "错误,除数不能为0"
a = 1/n
fn(0)



十三、	文件操作
1.	文件打开模式
	r  只读, 如果文件不存在则报错
	rb  只读二进制, 如果文件不存在则报错

	w  清空写, 如果文件不存在则创建该文件
	wb  清空写二进制, 如果文件不存在则创建该文件

	a  追加写, 如果文件不存在则创建该文件
	ab  追加写二进制, 如果文件不存在则创建该文件

2.	文件操作流程
	a.	打开文件
		fp = open('file', mode, encoding)
	b.	文件操作
		fp.read()
		fp.read()  所有内容
		fp.read(1024)  指定长度的内容
		fp.readline()  一行行读取
		fp.readlines()  读取所有行,返回列表
		fp.write()
	c.	关闭文件
		fp.close()
3.	编码,解码
	encode() : 编码 (字符串=>二进制)
	decode() : 解码 (二进制=>字符串)
4.	csv文件读写



十四、	正则表达式

1.	正则表达式的函数
	re.match(): 匹配是否以指定正则开头
	re.search(): 匹配是否包含正则的内容
	re.findall(): 查找所有正则匹配的内容,返回一个列表
	re.compile() : 编译正则,创建正则对象
	re.finditer(): 查找所有正则匹配的内容, 返回一个迭代器
	re.split() : 分割,可以写正则
	re.sub() : 替换,可以写正则
	re.subn(): 替换,可以写正则,返回包含替换的次数的元组
	
2.	 正则的符号
	a.	匹配单个字符
		. 表示匹配任意单个字符,但是不包含换行
		[ ] 表示匹配单个字符的一个范围
		\d 数字
		\w 数字字母下划线
		\s 空格

	b.	匹配字符数量
		?  表示前面字符的数量可以出现0或1次
		+ 表示前面字符的数量可以出现1或多次
		*  表示前面字符的数量可以出现0或多次
		{ } 表示可以出现指定次数或次数范围

	c.	边界字符
		^ 开头匹配
		$ 结尾匹配
		^$ 完全匹配
		\A \Z
		\b \B
		
	d.	分组和捕获
		( ) : 当成整体, 分组
		group( ): 获取分组内容
		groups() : 获取所有分组内容

	e.	非捕获性分组
		(?:) 不会捕获

		f.	或
		|  或者

	g.	分组别名
		(?P<name> pattern) : 给分组取别名

3.	flags
	re.I : 忽略大小写
	re.S: 让点语法(.)可以匹配到换行
	re.M: 换行模式



十五、	网络通信
1.	TCP
	a.	TCP的特点:
		i.	可靠的, 发送数据前会建立可靠的长连接('三次握手')
		ii.	双向通讯: 客户端可以给服务端发数据,服务端可以向客户端发数据
		iii.	即时性: 随时可以发数据(因为有长连接)
		iv.	断开连接时会进行'四次挥手'
		v.	相对UDP慢
		b.	TCP的使用
		i.	服务器端

	# TCP通讯 服务端
import socket

	# 1. 创建一个socket对象(服务端)
	#    AF_INET: IPV4
	#    AF_INET6: IPV6
	#   SOCK_STREAM: 表示TCP协议
	#   SOCK_DGRAM: 表示UDP协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

	# 2. 绑定IP和PORT
server_socket.bind( ('10.36.139.197', 6668) )

	# 3. 设置监听数(客户端连接数)
server_socket.listen(5)

	# 4. 等待客户端来连接我
print("服务器已启动, 等待客户端连接...")
client, addr = server_socket.accept()  # 会让程序暂停
	# (<socket.socket fd=420, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('10.36.139.197', 6668), raddr=('10.36.139.197', 60773)>, ('10.36.139.197', 60773))
	# print(client)
	# print(addr)
print("有客户端连接成功了")

	# 5. 连接成功后,就可以开始收发数据了
while True:
	# 接收数据, 阻塞程序(让程序暂停)
data = client.recv(1024)
print("客户端说:", data.decode())

	# 发送数据给客户端
client.send("今晚吃鸡吗".encode())


	# 6. 关闭连接
	# server_socket.close()


ii.	客户端

	# TCP通讯 客户端
import socket

	# 1. 创建socket对象(客户端)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

	# 2. 主动连接服务器端
client_socket.connect( ('10.36.139.197', 6668) )

	# 3. 发送和接收服务器数据
while True:
	# 发送给服务器
data = input("输入发送给服务器的数据:")
client_socket.send(data.encode())

	# 接收服务器数据
data2 = client_socket.recv(1024)
print("服务器:", data2.decode())

2.	UDP
	a.	UDP的特点
		i.	不可靠的, 不会建立长连接
		ii.	发数据报, 广播形式
		iii.	相对TCP快
	b.	UDP的使用
		i.	服务端

	# UDP通讯 服务端
import socket

	# 1. 创建UDP的socket对象
	# SOCK_DGRAM: 表示UDP
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

	# 2. 绑定ip和port
server_socket.bind( ('10.36.139.197', 5677) )

	# 3. 收发数据
while True:
	# 接收数据, 会阻塞程序
data, addr = server_socket.recvfrom(1024)
print(f"客户端{addr}说:", data.decode())

	# 发送
server_socket.sendto('今晚吃鸡'.encode(), addr)

ii.	客户端

	# UDP通讯 客户端
import socket

	# 1. 创建UDP的socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

	# 2. 收发数据
while True:
	# 发送数据
data = input("客户端说:")
client_socket.sendto(data.encode(), ('10.36.139.197', 5677))

	# 接收数据
data2, addr = client_socket.recvfrom(1024)
print("服务器说:", data2.decode())


十六、	发送邮件
1.	邮箱和邮件的区别
2.	代码实现

import smtplib
from email.mime.text import MIMEText

	# 邮箱
	# 邮件

	# 163的邮箱服务器: smtp.163.com
	# smtp端口:25
	# 邮箱账号: hejiayu@163.com
	# 授权码: 123456abcde

smtp_server = "smtp.163.com"
smtp_port = 25

from_email = 'hejiayu@163.com'
email_code = '123456abcde'  # 这里不是邮箱密码,而是授权码

to_email = ['hejiayu@163.com', '420481391@qq.com']

	# 创建邮件
msg = MIMEText("今晚来我家吃鸡")
msg['Subject'] = '大吉大利22'  # 标题
msg['From'] = from_email
msg['To'] = 'hejiayu@163.com'

	# 创建邮箱对象,来发送邮件
smtp = smtplib.SMTP(smtp_server, smtp_port)  # 连接163邮箱服务器
smtp.login(from_email, email_code)  # 登录163邮箱

smtp.sendmail(from_email, to_email, msg.as_string())

	# 关闭
smtp.close()



十七、	发送短信

1.	互亿无线

import requests

	# 用户名 查看用户名请登录用户中心->验证码、通知短信->帐户及签名设置->APIID
account  = "C80604386"
	# 密码 查看密码请登录用户中心->验证码、通知短信->帐户及签名设置->APIKEY
password = "16874f2ed0a2d0bb225747370f9aedc4"
mobile = "18566218480"
text = "您的验证码是:121254。请不要把验证码泄露给其他人。"

url = 'http://106.ihuyi.com/webservice/sms.php?method=Submit'
data = {'account': account, 'password' : password, 'content': text, 'mobile':mobile,'format':'json'}

res = requests.post(url, data=data)
print(res, res.text)

2.	云之讯

	# 云之讯
import requests
import random

def send_sms(phone, vcode):
'''
发送短信
:param phone: 手机号
:param vcode: 验证码
'''

	# 云之讯的短信接口
url = "https://open.ucpaas.com/ol/sms/sendsms"

data = {
"sid": "7d946861e6b2d74b2db38a442a19fd38",
"token": "8712938e22c34a179b3cea43ff783b68",
"appid": "36c083fcfdcf47b5b50d6a94fbb0e50c",

"templateid": "422930",  # 短信模板id
"param": vcode,  # 验证码
"mobile": phone,  # 接收验证码的手机号
}

	# requests
res = requests.post(url, json=data)
return res.text

def generate_vcode():
'''
生成随机6位验证码
'''
vcode = ""
for _ in range(6):
vcode += str(random.randint(0, 9))
return vcode

if __name__ == '__main__':
vcode = generate_vcode()
print("vcode:", vcode)

res = send_sms('18566218480', vcode)
print(res)


十八、	线程
1.	GIL
	a.	全局解释器锁
	b.	Python默认的解释器cpython自带的功能
	c.	作用: 控制只允许同一时间有一个线程在使用
	d.	好处: 保证程序的完整性,避免线程的部分问题.
2.	创建线程
	a.	_thread
	b.	Thread
	c.	自定义线程
3.	多线程
	a.	有多个线程
4.	线程冲突和线程锁
	a.	线程冲突: 多个线程使用同一个资源时造成的冲突问题
	b.	互斥锁: 解决线程冲突, Lock
	c.	死锁: 多个线程使用多个资源时造成的相互占用对方资源问题
	d.	递归锁: 解决死锁
5.	信号量
	a.	控制最大的线程并发数
6.	相关概念
	a.	同步: 在同一个线程中,按照顺序依次执行
	b.	异步: 在不同的线程中,执行不同的任务,没有顺序
	c.	串行: 类似同步
	d.	并行: 类似异步
	e.	并行: CPU数量 >= 任务数量
	f.	并发: CPU数量 < 任务数量

十九、	进程
1.	创建进程
	a.	Process
	b.	自定义进程
2.	多进程
	a.	多个进程 
3.	进程锁和信号量
	a.	multiprocess.Lock( )
	b.	信号量Semaphore: 控制进程的最大并发数


二十、	协程
1.	创建协程
	a.	greenlet+switch
	b.	gevent+sleep
	c.	gevent+monkey


二十一、	高阶函数
1.	sorted( )
2.	reversed( )
3.	map( )
4.	reduce( )
5.	filter( )

二十二、	JSON模块和Pickle
1.	json模块
	a.	json解析/json反序列化
		i.	json.loads( )
	b.	json序列化
		i.	json.dumps( )
2.	pickle模块
	a.	python对象存入文件
		i.	pickle.dump( )
	b.	从文件中取出
		i.	pickle.load( )


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值