安装环境

菜鸟教程参考

mac安装

安装 pyenv

brew update
brew install pyenv

配置 pyenv

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init --path)"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
source ~/.zshrc

安装Python 3.9.4

pyenv install 3.9.4

设置全局或本地版本

pyenv global 3.9.4

或者仅在特定项目中使用

cd /path/to/your/project
pyenv local 3.9.4

基础语法

# 输出
print('你好')
# 变量输出
name='李四'
print(f'{name}你好'

# 键盘输入
name = input('请输入用户名')

# 不换行输出
print( x, end=" " )
print( y, end=" " )
print()

# 获取长度
name='abcd'
print(len(name))

# 截取
file_name = k.split('/')[-1] # 截取最后一个/后面的内容

# max() 最大
# min() 最小

# 保留指定位数
format(格式化的变量, '.2f')
# 第二种 保留3位小数
print("{:.3f} + {:.3f} = {:.3f}".format(number1, number2, addres))


#随机数
import random

# 生成一个0到9之间的随机整数
num = random.randint(0, 9)
print(num)

# 生成一个1到100之间的随机整数
num = random.randint(1, 100)
print(num)

# 生成一个从0到10(不包括10)的随机整数
num = random.randrange(10)
print(num)

# 生成一个从10到20(不包括20)的随机整数
num = random.randrange(10, 20)
print(num)

# 生成一个从0到1之间的随机浮点数
num = random.random()
print(num)


# 随机选择列表的某一个
random.choice(province_list)


# 随机当月的一个日期
def gettime():
now = datetime.datetime.now()
start_of_month = datetime.datetime(now.year, now.month, 1)
end_of_month = datetime.datetime(now.year, now.month, 28) + datetime.timedelta(days=4)

random_date = start_of_month + (end_of_month - start_of_month) * random.random()
restime = random_date.strftime("%Y-%m-%d %H:%M:%S")
return restime

基本数据类型

  • Number(数字)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Set(集合)
  • Dictionary(字典)
# 数据类型
# Number(数自)
# String(字符串)
# Tuple(元组)
# List(列表)
# Dictionary(字典)
# Set(集合)


# int
t1 = 10
print(type(t1))

# float
t2 = 10.2
print(type(t2))

# string
t3 = 'abcd'
print(type(t3))

# List
t4 = [1, 2, 3, 4]
print(type(t4))

# 元组 tuple
t5 = ('您好', 'ok1')
print(type(t5))

# 字典 dict
t6 = {'a': 1, 'b': 10}
print(type(t6))

# set
t7 = {1, 3, 4, 5, 6}
print(type(t7))

数据类型转换

函数描述
int(x [,base])将x转换为一个整数
float(x)将x转换到一个浮点数
complex(real [,imag])创建一个复数
str(x)将对象 x 转换为字符串
repr(x)将对象 x 转换为表达式字符串
eval(str)用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s)将序列 s 转换为一个元组
list(s)将序列 s 转换为一个列表
set(s)转换为可变集合
dict(d)创建一个字典。d 必须是一个 (key, value)元组序列。
frozenset(s)转换为不可变集合
chr(x)将一个整数转换为一个字符
ord(x)将一个字符转换为它的整数值
hex(x)将一个整数转换为一个十六进制字符串
oct(x)将一个整数转换为一个八进制字符串
float(intput())
int(intput())
print(str(name))

注释

# 注释

'''
这是多行注释,用三个单引号
这是多行注释,用三个单引号
这是多行注释,用三个单引号
'''

"""
这是多行注释,用三个双引号
这是多行注释,用三个双引号
这是多行注释,用三个双引号
"""

运算符

算术运算符

以下假设变量 a=10,变量 b=21

运算符描述实例
+加 - 两个对象相加a + b 输出结果 31
-减 - 得到负数或是一个数减去另一个数a - b 输出结果 -11
*乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 210
/除 - x 除以 yb / a 输出结果 2.1
%取模 - 返回除法的余数b % a 输出结果 1
**幂 - 返回x的y次幂a**b 为10的21次方
//取整除 - 往小的方向取整数>>> 9//2 4 >>> -9//2 -5
# 算数运算符
# + 相加
# - 减
# / 除
# % 取莫
# ** 幂 x的y次幂
# // 取整除 往小方向取整

a = 10
b = 21
print(a + b) # 31
print(a - b) # -11
print(a * b) # 210
print(a / b) # 2.1
print(a % b) # 1
print(a ** b) # 10的21次方
print(a // b) # 9//2=4 -9//2=-5

比较运算符

以下假设变量a为10,变量b为20:

运算符描述实例
==等于 - 比较对象是否相等(a == b) 返回 False。
!=不等于 - 比较两个对象是否不相等(a != b) 返回 True。
>大于 - 返回x是否大于y(a > b) 返回 False。
<小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。(a < b) 返回 True。
>=大于等于 - 返回x是否大于等于y。(a >= b) 返回 False。
<=小于等于 - 返回x是否小于等于y。(a <= b) 返回 True。

赋值运算符

以下假设变量a为10,变量b为20:

运算符描述实例
=简单的赋值运算符c = a + b 将 a + b 的运算结果赋值为 c
+=加法赋值运算符c += a 等效于 c = c + a
-=减法赋值运算符c -= a 等效于 c = c - a
*=乘法赋值运算符c *= a 等效于 c = c * a
/=除法赋值运算符c /= a 等效于 c = c / a
%=取模赋值运算符c %= a 等效于 c = c % a
**=幂赋值运算符c **= a 等效于 c = c ** a
//=取整除赋值运算符c //= a 等效于 c = c // a
:=海象运算符,可在表达式内部为变量赋值。Python3.8 版本新增运算符在这个示例中,赋值表达式可以避免调用 len() 两次:
if (n := len(a)) > 10: print(f"List is too long ({n} elements, expected <= 10)")

位运算符

运算符描述实例
&按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0(a & b) 输出结果 12 ,二进制解释: 0000 1100
按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。
^按位异或运算符:当两对应的二进位相异时,结果为1(a ^ b) 输出结果 49 ,二进制解释: 0011 0001
~按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。~x 类似于 -x-1(~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。
<<左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。a << 2 输出结果 240 ,二进制解释: 1111 0000
>>右移动运算符:把">>“左边的运算数的各二进位全部右移若干位,”>>"右边的数指定移动的位数a >> 2 输出结果 15 ,二进制解释: 0000 1111

逻辑运算符

Python语言支持逻辑运算符,以下假设变量 a 为 10, b为 20:

运算符逻辑表达式描述实例
andx and y布尔"与" - 如果 x 为 False,x and y 返回 x 的值,否则返回 y 的计算值。(a and b) 返回 20。
orx or y布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值。(a or b) 返回 10。
notnot x布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。not(a and b) 返回 False

成员运算符

运算符描述实例
in如果在指定的序列中找到值返回 True,否则返回 False。x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in如果在指定的序列中没有找到值返回 True,否则返回 False。x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

身份运算符

运算符描述实例
isis 是判断两个标识符是不是引用自一个对象x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False
is notis not 是判断两个标识符是不是引用自不同对象x is not y , 类似 id(x) != id(y)。如果引用的不是同一个对象则返回结果 True,否则返回 False
# is not None 示例
if dab is not None: # 当查询到数据时
print("欢迎" + dab[1] + "登录成功!")
else: # 没有查询到数据 错误时
count += 1
if count == 3: # 错误次数满3次 锁定银行卡
upse = "update bank set isdisable=1 where carid=" + carid
# 执行数据库锁定银行卡
update_db(upse)
print("您已经连续输入错3次,银行卡被锁定!")
break
else:
print("您已经连续" + str(count) + '次错误,还有' + str(3 - count) + "次机会")
continue

数字

数学函数

函数返回值 ( 描述 )
abs(x)返回数字的绝对值,如abs(-10) 返回 10
ceil(x)返回数字的上入整数,如math.ceil(4.1) 返回 5
cmp(x, y)如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。 Python 3 已废弃,使用 (x>y)-(x<y) 替换
exp(x)返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045
fabs(x)返回数字的绝对值,如math.fabs(-10) 返回10.0
floor(x)返回数字的下舍整数,如math.floor(4.9)返回 4
log(x)如math.log(math.e)返回1.0,math.log(100,10)返回2.0
log10(x)返回以10为基数的x的对数,如math.log10(100)返回 2.0
max(x1, x2,…)返回给定参数的最大值,参数可以为序列。
min(x1, x2,…)返回给定参数的最小值,参数可以为序列。
modf(x)返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。
pow(x, y)x**y 运算后的值。
round(x [,n])返回浮点数 x 的四舍五入值,如给出 n 值,则代表舍入到小数点后的位数。
其实准确的说是保留值将保留到离上一位更近的一端。
sqrt(x)返回数字x的平方根。

随机数函数

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。

Python包含以下常用随机数函数:

函数描述
choice(seq)从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。
randrange ([start,] stop [,step])从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1
random()随机生成下一个实数,它在[0,1)范围内。
seed([x])改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。
shuffle(lst)将序列的所有元素随机排序
uniform(x, y)随机生成下一个实数,它在[x,y]范围内。

三角函数

Python包括以下三角函数:

函数描述
acos(x)返回x的反余弦弧度值。
asin(x)返回x的反正弦弧度值。
atan(x)返回x的反正切弧度值。
atan2(y, x)返回给定的 X 及 Y 坐标值的反正切值。
cos(x)返回x的弧度的余弦值。
hypot(x, y)返回欧几里德范数 sqrt(xx + yy)。
sin(x)返回的x弧度的正弦值。
tan(x)返回x弧度的正切值。
degrees(x)将弧度转换为角度,如degrees(math.pi/2) , 返回90.0
radians(x)将角度转换为弧度

数学常量

常量描述
pi数学常量 pi(圆周率,一般以π来表示)
e数学常量 e,e即自然常数(自然常数)

字符串

Python转义字符

在需要在字符中使用特殊字符时,python 用反斜杠 </font> 转义字符。如下表:

转义字符描述实例
(在行尾时)续行符>>> print(“line1 \ … line2 \ … line3”) line1 line2 line3 >>>
\反斜杠符号>>> print(“\”) </font>
'单引号>>> print(‘’') '
"双引号>>> print(“”") "
\a响铃>>> print(“\a”)执行后电脑有响声。
\b退格(Backspace)>>> print(“Hello \b World!”) Hello World!
\000>>> print(“\000”) >>>
\n换行>>> print(“\n”) >>>
\v纵向制表符>>> print(“Hello \v World!”) Hello World! >>>
\t横向制表符>>> print(“Hello \t World!”) Hello      World! >>>
\r回车,将 \r 后面的内容移到字符串开头,并逐一替换开头部分的字符,直至将 \r 后面的内容完全替换完成。>>> print(“Hello\rWorld!”) World! >>> print(‘google runoob taobao\r123456’) 123456 runoob taobao
\f换页>>> print(“Hello \f World!”) Hello World! >>>
\yyy八进制数,y 代表 0~7 的字符,例如:\012 代表换行。>>> print(“\110\145\154\154\157\40\127\157\162\154\144\41”) Hello World!
\xyy十六进制数,以 \x 开头,y 代表的字符,例如:\x0a 代表换行>>> print(“\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21”) Hello World!
\other其它的字符以普通格式输出

Python字符串运算符

下表实例变量 a 值为字符串 “Hello”,b 变量值为 “Python”:

操作符描述实例
+字符串连接a + b 输出结果: HelloPython
*重复输出字符串a*2 输出结果:HelloHello
[]通过索引获取字符串中字符a[1] 输出结果 e
[ : ]截取字符串中的一部分,遵循左闭右开原则,str[0:2] 是不包含第 3 个字符的。a[1:4] 输出结果 ell
in成员运算符 - 如果字符串中包含给定的字符返回 True‘H’ in a 输出结果 True
not in成员运算符 - 如果字符串中不包含给定的字符返回 True‘M’ not in a 输出结果 True
r/R原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r(可以大小写)以外,与普通字符串有着几乎完全相同的语法。print( r’\n’ ) print( R’\n’ )
%格式字符串请看下一节内容

Python 字符串格式化

Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。

在 Python 中,字符串格式化使用与 C 中 sprintf 函数一样的语法。

#!/usr/bin/python3print(我叫 %s 今年 %d 岁! % (小明, 10))

以上实例输出结果:

我叫 小明 今年 10 岁!

python字符串格式化符号:

符号描述
%c格式化字符及其ASCII码
%s格式化字符串
%d格式化整数
%u格式化无符号整型
%o格式化无符号八进制数
%x格式化无符号十六进制数
%X格式化无符号十六进制数(大写)
%f格式化浮点数字,可指定小数点后的精度
%e用科学计数法格式化浮点数
%E作用同%e,用科学计数法格式化浮点数
%g%f和%e的简写
%G%f 和 %E 的简写
%p用十六进制数格式化变量的地址

格式化操作符辅助指令:

符号功能
*定义宽度或者小数点精度
-用做左对齐
+在正数前面显示加号( + )
在正数前面显示空格
#在八进制数前面显示零(‘0’),在十六进制前面显示’0x’或者’0X’(取决于用的是’x’还是’X’)
0显示的数字前面填充’0’而不是默认的空格
%‘%%‘输出一个单一的’%’
(var)映射变量(字典参数)
m.n.m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)

Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。

Python 的字符串内建函数

Python 的字符串常用内建函数如下:

序号方法及描述
1capitalize() 将字符串的第一个字符转换为大写
2center(width, fillchar)
返回一个指定的宽度 width 居中的字符串,fillchar 为填充的字符,默认为空格。
3count(str, beg= 0,end=len(string))
返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
4bytes.decode(encoding=“utf-8”, errors=“strict”)
Python3 中没有 decode 方法,但我们可以使用 bytes 对象的 decode() 方法来解码给定的 bytes 对象,这个 bytes 对象可以由 str.encode() 来编码返回。
5encode(encoding=‘UTF-8’,errors=‘strict’)
以 encoding 指定的编码格式编码字符串,如果出错默认报一个ValueError 的异常,除非 errors 指定的是’ignore’或者’replace’
6endswith(suffix, beg=0, end=len(string)) 检查字符串是否以 suffix 结束,如果 beg 或者 end 指定则检查指定的范围内是否以 suffix 结束,如果是,返回 True,否则返回 False。
7expandtabs(tabsize=8)
把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8 。
8find(str, beg=0, end=len(string))
检测 str 是否包含在字符串中,如果指定范围 beg 和 end ,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回-1
9index(str, beg=0, end=len(string))
跟find()方法一样,只不过如果str不在字符串中会报一个异常。
10isalnum()
如果字符串至少有一个字符并且所有字符都是字母或数字则返 回 True,否则返回 False
11isalpha()
如果字符串至少有一个字符并且所有字符都是字母或中文字则返回 True, 否则返回 False
12isdigit()
如果字符串只包含数字则返回 True 否则返回 False…
13islower()
如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
14isnumeric()
如果字符串中只包含数字字符,则返回 True,否则返回 False
15isspace()
如果字符串中只包含空白,则返回 True,否则返回 False.
16istitle()
如果字符串是标题化的(见 title())则返回 True,否则返回 False
17isupper()
如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False
18join(seq)
以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
19len(string)
返回字符串长度
20ljust(width[, fillchar])
返回一个原字符串左对齐,并使用 fillchar 填充至长度 width 的新字符串,fillchar 默认为空格。
21lower()
转换字符串中所有大写字符为小写.
22lstrip()
截掉字符串左边的空格或指定字符。
23maketrans()
创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
24max(str)
返回字符串 str 中最大的字母。
25min(str)
返回字符串 str 中最小的字母。
26replace(old, new [, max])
把 将字符串中的 old 替换成 new,如果 max 指定,则替换不超过 max 次。
27rfind(str, beg=0,end=len(string))
类似于 find()函数,不过是从右边开始查找.
28rindex( str, beg=0, end=len(string))
类似于 index(),不过是从右边开始.
29rjust(width,[, fillchar])
返回一个原字符串右对齐,并使用fillchar(默认空格)填充至长度 width 的新字符串
30rstrip()
删除字符串末尾的空格或指定字符。
31split(str=“”, num=string.count(str))
以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串
32splitlines([keepends])
按照行(‘\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
33startswith(substr, beg=0,end=len(string))
检查字符串是否是以指定子字符串 substr 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查。
34strip([chars])
在字符串上执行 lstrip()和 rstrip()
35swapcase()
将字符串中大写转换为小写,小写转换为大写
36title()
返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
37translate(table, deletechars=“”)
根据 table 给出的表(包含 256 个字符)转换 string 的字符, 要过滤掉的字符放到 deletechars 参数中
38upper()
转换字符串中的小写字母为大写
39zfill (width)
返回长度为 width 的字符串,原字符串右对齐,前面填充0
40isdecimal()
检查字符串是否只包含十进制字符,如果是返回 true,否则返回 false。

f-string

print(f'{client_address} 离开')  # 可以放变量

列表

列表类似数组

# 列表

# 列表的创建
# 第一种
letar = []

# 第二种
letar2 = ['李四', '王无', '羡羡', '颖颖']

# 第三种 内置list 列表种可以存储不同的数据类型 也可以是任何对象
letar3 = list(['tool', 1, 8.8, ('tool188',), ['tool', 188]])
# 添加元素
letar3.append(90)

# 修改元素 对指定的小标进行重新赋值
letar2[0] = '月亮追太阳'
print(letar2)

# 删除元素
del letar3[2]

# 访问元素
name = list('per1')
print(name[2]) # r

print(name[2:]) # r,1

# 遍历 第一种
for items in letar2:
print(items)

print('*****************')

# 遍历 第二种 range len遍历 i为下标
for i in range(len(letar2)):
print(i, letar2[i])

print('*****************')

# 遍历 第三种 enumerate
for i, items in enumerate(letar2):
print(i, items)


元组

# 元组

# 如果只有一位时后面需要添加,
tel = (1,)

te2 = ('测试1', '测试2', '测试3')
# 访问
print(te2[0])

# 解包
tpl = ('滴滴', '货车帮', '运满满', '货拉拉')
# 解包
a, b, c, d = tpl
print(a, b, c, d)

# 元组的修改

t1 = (1, 88)
t2 = (89, 10)
t3 = t1 + t2
print(t3)

# 元组删除
tup = ('SM Entertainment', 'JYP', 'YG Entertainment', 'DSP')
print(tup)
del tup


字典

字典相当于对象

# 字典 键值对

# 创建
dicl = {'a': '李四', 'b': '王无'}
print(dicl['a'])

# 更新字典
dicl['a'] = '您好'

# 删除字典
del dicl['a'] # 删除键 'Name'
dicl.clear() # 清空字典
del dicl # 删除字典

# 访问字典
# value = dic[key] key为键

斐波拉契列

a, b = 0, 1
while b < 1000:
print(b, end=',') # 同一行
a, b = b, a + b

# 1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,

条件控制

from random import random

age = int(input("请输入年龄:"))
if age >= 18:
print("成年人!")
else:
print("小朋友!")

age2 = int(input("请输入年龄:"))
if 18 < age2 < 30:
print("成年人!")
elif age2 > 30:
print("ok1")
else:
print("comm me")

# round() 保留指定小数位

age3 = float(input("OK:"))
print(round(age3, 2)) # 保留指定位数

循环语句

break 语句可以跳出 for 和 while 的循环体。如果你从 for 或 while 循环中终止,任何对应的循环 else 块将不执行。

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

# while
b = 0
while 1 == 1:
b += 1
print(1)
if b == 20:
break

# while else
count = 0
while count < 5:
print(count, " 小于 5")
count = count + 1
else:
print(count, " 大于或等于 5")

# for
letar = [12, 5, 6, 7, 7, 7]
for x in letar:
print(x)

# for else

for x in letar:
print(x)
else: # 循环结束后执行
print('循环OK!')

# range 指定区间 不包含最后位置 比如下下面只到9
for x in range(1, 10):
print(x)



# range(0, 10) 生成0到10的序列
# range(开始值,结束值(不包含),步长)
for s in range(0, 101, 10):
print(1)

print("***********")

# 变量容器 或者 序列 列表
letok = ['李四', '张三', '王开']
for i in range(len(letok)):
print(i, letok[i])

print("*************")

for name in letok:
if name == '李四':
print('有这个人物')
print(name)

# 元组遍历
mk = (60, 90, 45, 87)
score = 0
for i in mk:
score += i
print(i)
print("平均分:" + str(score / 4))

print("*************")

# 字典
zd = {'a': 10, 'b': 20, 'c': 30}
for k in zd:
print(k)

print("*************")

# 集合
jh = {1, 2, 3, 4, 6}
for k in jh:
print(k)


函数

内置函数

starr = [10, 2, 3, 40, 5, 6, 7, 9]

# sorted 排序
newlist = sorted(starr) # 升序
newlist2 = sorted(starr, reverse=True) # 降序
print(newlist)
print(newlist2)

# 最大最小值

m1 = max(starr)
print(m1)
m2 = min(starr)
print(m2)

# 求和
su = sum(starr)
print(su)

# 平均数
svg = (sum(starr) / len(starr))
print(svg)

# 反转

newlist3 = reversed(starr) # 得到的是一个迭代器
for k in newlist3:
print(k)

# 获取遍历ID
a = 5
b = 5
print(id(a), id(b)) # 4366729584 4366729584


# 二进制转化
a = 12
r = bin(a)
print(r)

函数

# def 函数名 (参数1, 参数2....):
# 函数体

# 变量定义类型 str转化字符串
def fun1(a: str, b: float):
print("计算机的名字是:" + a + "\t价格:" + str(b))


name = input("请输入计算机的名字:")
price = float(input("请输入电脑价格:"))
fun1(name, price)


# 返回多个值
def function1():
a = 10
b = 100
c = 98
return a, b, c


r1, r2, r3 = function1()
print(r1, r2, r3)

# 匿名函数
xrt = lambda a: a + 10
print(xrt(5))


# 元素形式传 * 不定长度
def printinfo(arg1, *vartuple):
"打印任何传入的参数"
print("输出: ")
print(arg1)
print(vartuple)


# 调用printinfo 函数
printinfo(70, 60, 50)


# 字典形式传入 **
def funtcion(nam, **mk):
print(nam)
print(mk)


funtcion(1, a=2, b=3)


# 默认参数
# 可写函数说明
def printinfo(name, age=35):
"打印任何传入的字符串"
print("名字: ", name)
print("年龄: ", age)
return


# 调用printinfo函数 没有传值时使用
printinfo(age=50, name="runoob")
print("------------------------")
printinfo(name="runoob")

模块

新建单独文件 mk.py

def ku(a, b):
return a + b

测试模块 新建模块.py

import mk1

print(mk1.ku(1, 4))

读写文件

open() 将会返回一个 file 对象,基本语法格式如下:

open(filename, mode)

  • filename:包含了你要访问的文件名称的字符串值。
  • mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读®。

不同模式打开文件的完全列表:

模式描述
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

写入

fh = open("/Users/xianxian/Desktop/01.txt", 'w')  # 写入

fh.write('大家好我是渣渣辉!') # 写入不追加

fh.close()

# 文件追加写入
fh = open('/Users/xianxian/Desktop/01.txt', 'a') # 追加
fh.write('\r大家好')


//示例
with open('combinations.txt', 'w') as f:
for combination in combinations:
f.write(str(combination) + '\n')

读取文件

let = open('/Users/xianxian/Desktop/未命名.txt', "r")
# 读取使用
data = let.read()
print(data)
let.close() # 关闭

data = let.readline() # 按行读取
print(data)

data = let.readlines() # 按行取所有

for i in let:
print(i)

let.close()

异常处理

try:  # 异常处理
money = float(input("请输入存款金额:"))
crsql = "update bank set balance=balance+{} where id={}".format(money, dab[0]) # 格式化
introw = update_db(crsql) # 执行修改
if introw >= 1: # 修改成功
seall = select_db(se_sql) # 查询最新数据
print("存入" + str(money) + "元,余额:" + str(seall[4]))
break
else: # 输入错误
print("存入错误!")
continue
except Exception as err: # 异常回滚
db.rollback()
print(err)
break
finally:
print(1)

连接数据库

pymysql

import pymysql

# 打开数据连接 主机地址 端口号 账号 密码
db = pymysql.Connect(host="127.0.0.1", port=3306, user="root", passwd="root", db="studentdb", charset="utf8")

# 创建游标对象 执行数据库操作
cursor = db.cursor()

# 创建表
sql = """create table test(id int not null,name varchar(15),age int)"""
# 执行sql
cursor.execute(sql)

# 添加数据
sql = 'insert into test values(2,"李思2",20)'
cursor.execute(sql)
db.commit()

# 查询数据
sql = "select * from test"
cursor.execute(sql)
data1 = cursor.fetchall() # fetchall 获取所有 fetchone 获取一行
print(data1) # 得到的是元组

# 更新操作
sql = "update test set name='羡羡' where id=2"
cursor.execute(sql)
# 获取更新行数
row_count = cursor.rowcount
db.commit()

# 删除操作
sql = "delete from test where id=1"
cursor.execute(sql)
db.commit()

# 事务回滚
sql = "delete from test where id=1"
try:
cursor.execute(sql)
db.commit()
except Exception as e:
db.rollback() # 回滚

cursor.close()

mysql-connect

import pymysql


# connect to the database(连接数据库)
def connect_db():
return pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='root',
database='cctv',
charset='utf8'
)


# 插入
def insert_data(tb: str, conn: pymysql.Connection):
cur = conn.cursor()
sql = 'INSERT INTO {table} (post_id) VALUES (1), (2), (3)'.format(table=tb)
cur.execute(sql)
cur.close()
conn.commit()
conn.close()


# 查询 fetchone获取一条数据 fetchmany(size)获取指定条数 fetchall()获取所有
def select_data(tb: str, conn: pymysql.Connection):
cur = conn.cursor()
sql = 'SELECT * FROM {table}'.format(table=tb)
cur.execute(sql)
result = cur.fetchone()
print(type(result), result)
cur.close()


# 删除
def detel_from_table(tb: str, conn: pymysql.Connection):
cur = conn.cursor()
sql = 'delete from {table}'.format(table=tb)
cur.execute(sql)
cur.close()
conn.commit()
conn.close()


示例

import pymysql

# 打开数据连接 主机地址 端口号 账号 密码
db = pymysql.Connect(
host="127.0.0.1",
port=3306,
user="root",
passwd="root",
db="cctv",
charset="utf8"
)

# 创建游标对象 执行数据库操作
cursor = db.cursor()


# 查询数据库
def select_db(sql):
cursor.execute(sql)
data = cursor.fetchone() # 获取一条
return data


# 修改数据库
def update_db(sql):
cursor.execute(sql)
# 获取更新行数
row_count = cursor.rowcount
db.commit()
return row_count


count = 0 # 统计错误
se_sql = "" # 查询语句
while 1 == 1:
carid = input("请输入卡号:")
carpwd = input("请输入密码:")
se_sql = "select * from bank where carid=" + carid + " and uspass=" + carpwd
dab = select_db(se_sql) # 执行查询
if dab is not None: # 当查询到数据时
print("欢迎" + dab[1] + "登录成功!")
else: # 没有查询到数据 错误时
count += 1
if count == 3: # 错误次数满3次 锁定银行卡
upse = "update bank set isdisable=1 where carid=" + carid
# 执行数据库锁定银行卡
update_db(upse)
print("您已经连续输入错3次,银行卡被锁定!")
break
else:
print("您已经连续" + str(count) + '次错误,还有' + str(3 - count) + "次机会")
continue
while 2 == 2:
choice = int(input("请输入需要办理的业务编号:(1.存款 2.取款 3.退出)\n"))
if choice == 1: # 存款
try: # 异常处理
money = float(input("请输入存款金额:"))
crsql = "update bank set balance=balance+{} where id={}".format(money, dab[0]) # 格式化
introw = update_db(crsql) # 执行修改
if introw >= 1: # 修改成功
seall = select_db(se_sql) # 查询最新数据
print("存入" + str(money) + "元,余额:" + str(seall[4]))
break
else: # 输入错误
print("存入错误!")
continue
except Exception as err: # 异常回滚
db.rollback()
print(err)
break
elif choice == 2: # 取款
try:
money = float(input("请输入取款金额:"))
qcsql = "update bank set balance=balance-{} where id={}".format(money, dab[0]) # 格式化
qrint = update_db(qcsql)
if qrint >= 1:
qcall = select_db(se_sql)
print("取出" + str(money) + "元,余额:" + str(qcall[4]))
break
else:
print("取出错误!")
continue
except Exception as err:
db.rollback()
print(err)
break
# 执行修改
elif choice == 3: # 退出
print("------退出-----")
break
else:
print("没有该业务!")
continue

网络编程

服务端 作为中转

import socket
import threading

# 设置主机和端口号
HOST = '127.0.0.1'
PORT = 8888

# 创建一个socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 将socket对象绑定到指定的主机和端口号
server_socket.bind((HOST, PORT))

# 开始监听连接
server_socket.listen()
print("服务器开启成功...")

# 存储客户端套接字的列表
clients = []


# 定义一个函数,用于向所有客户端广播消息
def broadcast(msg, sender):
for client in clients:
if client != sender:
client.send(msg)


# 定义一个函数,用于处理客户端的连接
def handle_client(client_socket, client_address):
print(f'来自新的连接 {client_address}')

# 将客户端套接字添加到列表中
clients.append(client_socket)

while True:
try:
# 接收客户端发送的消息
msg = client_socket.recv(1024)
if msg:
# 广播消息给所有客户端
broadcast(msg, client_socket)
else:
# 如果客户端断开连接,将其套接字从列表中移除
clients.remove(client_socket)
print(f'{client_address} 离开')
break
except:
# 如果发生错误,将其套接字从列表中移除
clients.remove(client_socket)
print(f'{client_address} 离开')
break


while True:
# 等待客户端连接
client_socket, client_address = server_socket.accept()

# 创建一个线程来处理客户端连接
client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
client_thread.start()

客户端 客户端可以多个

import socket
import threading

# 设置服务器主机和端口号
SERVER_HOST = '127.0.0.1'
SERVER_PORT = 8888

# 创建一个socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器
client_socket.connect((SERVER_HOST, SERVER_PORT))

# 请求用户输入昵称
nickname = input('请输入您的昵称: ')


# 定义一个函数,用于从服务器接收消息
def receive():
while True:
try:
# 接收消息
msg = client_socket.recv(1024).decode('utf-8')
if msg == 'NICK':
# 如果服务器要求用户输入昵称,将昵称发送给服务器
client_socket.send(nickname.encode('utf-8'))
else:
# 否则,打印消息和发送者昵称
print(msg)
except:
# 如果发生错误,关闭客户端套接字并退出程序
client_socket.close()
break


# 定义一个函数,用于向服务器发送消息
def send():
while True:
msg = input()
message = f'{nickname}: {msg}'
client_socket.send(message.encode('utf-8'))


# 创建两个线程,一个用于接收消息,一个用于发送消息
receive_thread = threading.Thread(target=receive)
send_thread = threading.Thread(target=send)

# 启动两个线程
receive_thread.start()
send_thread.start()

请求图片

当一个接口放浏览器的时候是直接一样图片我们需要获取图片的地址

import requests

response = requests.get('https://api.mtyqx.cn/tapi/random.php')
print(response.url)

导出项目的包

# 有时候会导出所有
pip freeze > requirements.txt


# 导出项目包
pip install pipreqs

pipreqs .

模块

def te2(a, b):
return a + b


def te3(a, b):
print(a - b)

使用

import t1

res = t1.te2(1, 6)
print(res)

打包python成exe

下载·

pip install pyinstaller

在文件下面执行命令

pyinstaller -F 文件名

最后在dist里面

定时指定时间执行

import schedule
import time

# 定义要执行的函数
def job():
print("Hello, World!")

# 设置早上 8 点和晚上 10 点执行定时任务
schedule.every().day.at("08:00").do(job)
schedule.every().day.at("22:00").do(job)

while True:
schedule.run_pending()
time.sleep(1)

image

flask

基础示例

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello World'

if __name__ == '__main__':
app.run()

SSL

import ssl
ssl._create_default_https_context = ssl._create_unverified_context
ln -s /etc/ssl/* /Library/Frameworks/Python.framework/Versions/Current/etc/openssl/

服务器运行

nohup python3 -u /opt/tools/Jkcdn/main.py &

nohup python /opt/tools/BackupCM/main.py > output.log 2>&1 &

nohup python /opt/tools/BackupCM/main.py > output.log 2>&1 &

进度条

pip install tqdm
from tqdm import tqdm

for i in tqdm (range (100), desc="Loading..."):
pass

虚拟环境

创建环境

python3 -m venv venv

激活环境

source venv/bin/activate

安装依赖

pip3 install -r requirements.txt

退出虚拟环境

deactivate

其他

查看已安装的包及其版本

pip3 list 

删除环境

rm -rf venv

查看日志

cat /tmp/crawler.log

rm -rf env

查看包的版本信息

pip3 show packname

通过进程查看具体项目

cat /proc/3450/cmdline   #3450为进程ID
cat /proc/3526/cmdline

openssl 1.x问题

ImportError: urllib3 v2 only supports OpenSSL 1.1.1+, currently the ‘ssl’ module is compiled with ‘OpenSSL 1.0.2k-fips 26 Jan 2017’. See: https://github.com/urllib3/urllib3/issues/2168

pip install requests urllib3==1.26.14

使用 pyenv-virtualenv 创建虚拟环境

安装 pyenv-virtualenv

brew install pyenv-virtualenv

创建虚拟环境

pyenv virtualenv 3.9.4 myenv

激活环境

pyenv activate myenv

退出环境

pyenv deactivate
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
source ~/.bashrc