揭阳做网站建设公司,怎样与知名网站做友情链接,徐州建站推广,wordpress有没有linux一、Python介绍
1、Python优点
学习成本低
开源
适应⼈群⼴泛
应⽤领域⼴泛
2、Python解释器
Python解释器作用#xff1a;运行Python文件
Python解释器分类 CPython#xff1a;C语⾔开发的解释器[官⽅]#xff0c;应⽤⼴泛的解释器。 IPython#xff1a;基于CPyth…一、Python介绍
1、Python优点
学习成本低
开源
适应⼈群⼴泛
应⽤领域⼴泛
2、Python解释器
Python解释器作用运行Python文件
Python解释器分类 CPythonC语⾔开发的解释器[官⽅]应⽤⼴泛的解释器。 IPython基于CPython的⼀种交互式解释器。 PyPy基于Python语⾔开发的解释器。 Jython运⾏在Java平台的解释器直接把Python代码编译成Java字节码执⾏。 IronPython运⾏在微软.Net平台上的Python解释器可以直接把Python代码编译成.Net的字节码。 3、PyCharm
PyCharm是⼀种Python IDE集成开发环境
1PyCharm新建⽂件
项⽬管理空⽩位置 — 右键 – New – PythonFile
2运⾏⽂件
代码内部 — 右键 – Run
3修改代码⽂字格式
[fifile] – [Settings]/[Default Settings] – [Editor] – [Font]
4Debug⼯具
断点位置⽬标要调试的代码块的第⼀⾏代码即可即⼀个断点即可。
打断点的⽅法单击⽬标代码的⾏号右侧空⽩位置在⽂件内部任意位置 — 右键 – Debug’⽂件名’ — 即可调出Debug⼯具⾯板 – 单击StepOver/F8即可按步执⾏代码。 Debug输出⾯板 Debugger显示变量和变量的细节 Console输出内容 4、查看python版本
cmd -- Python3 -V
二、Python基础语法
1、编码
Python 3 源码文件以 UTF-8 编码所有字符串都是 unicode 字符串
2、标识符
第一个字符必须是字母表中字母或下划线 _标识符的其他的部分由字母、数字和下划线组成标识符对大小写敏感可以用中文作为变量名
3、保留字
保留字即关键字我们不能把它们用作任何标识符名称。
Python 的标准库提供了一个 keyword 模块可以输出当前版本的所有关键字 import keywordkeyword.kwlist
[False, None, True, and, as, assert, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield]4、注释
Python中单行注释以 # 开头
# 第一个注释
print (Hello, Python!) # 第二个注释多行注释可以用多个 #号还有 和
# 第一个注释
# 第二个注释
第三注释
第四注释第五注释
第六注释5、行与缩进
缩进的空格数是可变的但是同一个代码块的语句必须包含相同的缩进空格数
6、多行语句
Python 通常是一行写完一条语句但如果语句很长我们可以使用反斜杠 \ 来实现多行语句
total item_one \item_two \item_three在 [], {}, 或 () 中的多行语句不需要使用反斜杠 \
total [item_one, item_two, item_three,item_four, item_five]7、空行
函数之间或类的方法之间用空行分隔表示一段新的代码的开始。类和函数入口之间也用一行空行分隔以突出函数入口的开始。
空行与代码缩进不同空行并不是 Python 语法的一部分。书写时不插入空行Python 解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码便于日后代码的维护或重构。 空行也是程序代码的一部分。 8、同一行显示多条语句
Python 可以在同一行中使用多条语句语句之间使用分号 ; 分割
name wmh; print(name)9、多个语句构成代码组
缩进相同的一组语句构成一个代码块我们称之代码组。
像if、while、def和class这样的复合语句首行以关键字开始以冒号( : )结束该行之后的一行或多行代码构成代码组。
我们将首行及后面的代码组称为一个子句(clause)
10、print 输出
print 默认输出是换行的如果要实现不换行需要在变量末尾加上 end
xa
yb
# 换行输出
print( x )
print( y )print(---------)
# 不换行输出
print( x, end )
print( y, end )
print()11、import 与 from…import
在 python 用 import 或者 from...import 来导入相应的模块。
将整个模块(somemodule)导入格式为 import somemodule从某个模块中导入某个函数,格式为 from somemodule import somefunction从某个模块中导入多个函数,格式为 from somemodule import firstfunc, secondfunc, thirdfunc将某个模块中的全部函数导入格式为 from somemodule import *
三、数据类型
1、赋值
Python 中的变量不需要声明。但每个变量在使用前都必须赋值变量赋值以后该变量才会被创建。
在 Python 中变量就是变量它没有类型我们所说的类型是变量所指的内存中对象的类型。
一个变量可以通过赋值指向不同类型的对象。
等号用来给变量赋值。
a wmh
print(a)Python允许你同时为多个变量赋值
a b c 1可以为多个对象指定多个变量
a, b, c 1, 2, runoob交换两变量的值
a,b b,a2、标准数据类型
Number数字String字符串List列表Tuple元组Set集合Dictionary字典 **不可变数据3 个**Number数字、String字符串、Tuple元组 **可变数据3 个**List列表、Dictionary字典、Set集合 3、Number数字
Python3 支持 int、float、bool、complex复数
整型(int)不分正负但不带小数点。Python3 整型是没有限制大小的所以 Python3 没有 Python2 的 Long 类型。布尔(bool)是整型的子类型。浮点型(float)浮点型由整数部分与小数部分组成可以用科学计数法表示2.5e2 2.5 x 102 250复数(complex)复数由实数部分和虚数部分构成可以用a bj,或者complex(a,b)表示 a和b都是浮点型。
可以用十六进制和八进制来代表整数 number 0xA0F # 十六进制number
2575 number0o37 # 八进制number
31内置的 type() 函数可以用来查询变量所指的对象类型 a, b, c, d 20, 5.5, True, 43jprint(type(a), type(b), type(c), type(d))
class int class float class bool class complex可以用 isinstance 来判断 a 111isinstance(a, int)
Truesinstance 和 type 的区别在于 type()不会认为子类是一种父类类型isinstance()会认为子类是一种父类类型 Python3 中bool 是 int 的子类True 和 False 可以和数字相加True1、False0会返回 True但可以通过 is 来判断类型。
issubclass(bool, int) # True
True1 # True
False0 # True
True1 # 2
False1 # 1
1 is True # False
0 is False # Falsedel语句删除单个或多个对象
del var
del var_a, var_bPython还支持复数复数由实数部分和虚数部分构成可以用a bj,或者complex(a,b)表示 复数的实部a和虚部b都是浮点型
在交互模式中最后被输出的表达式结果被赋值给变量 _ 类似于jQuery中的$ 1 2
3_
34、String字符串
字符串单引号 或双引号 括起来同时使用反斜杠 \ 转义特殊字符。
变量[头下标:尾下标:步长] # 字符串分片(左闭右开)索引值从左往右以0开始从右往左以-1开始
用运算符连接在一起用*运算符重复
print (str * 2) # 输出字符串两次也可以写成 print (2 * str)
print (str TEST) # 连接字符串使用反斜杠 \ 转义特殊字符
\r回车将 \r 后面的内容移到字符串开头并逐一替换开头部分的字符直至将 \r 后面的内容完全替换完成 print(google runoob taobao\r123456)
123456 runoob taobao在字符串前面添加一个 r表示原始字符串 print(Ru\noob)
Ru
oobprint(rRu\noob)
Ru\noob反斜杠(\)可以作为续行符表示下一行是上一行的延续。也可以使用 ... 或者 ... 跨越多行。
字符串格式化输出
print (我叫 %s 今年 %d 岁! % (小明, 10))符号描述%c格式化字符及其ASCII码%s格式化字符串%d格式化整数%f格式化浮点数字可指定小数点后的精度
f-string输出 name RunoobfHello {name} # 替换变量
Hello Runoob x 1print(f{x1}) # Python 3.8
x12Python 没有单独的字符类型一个字符就是长度为1的字符串。 与 C 字符串不同的是Python 字符串不能被改变。向一个索引位置赋值word[0] m会导致错误。
5、List列表
列表中元素的类型可以不相同它支持数字字符串与列表嵌套
列表写在方括号 [] 之间、用逗号分隔开的元素列表
和字符串一样列表同样可以被索引和截取列表被截取后返回一个包含所需元素的新列表。
变量[头下标:尾下标:步长] # 列表分片索引值从左往右以0开始从右往左以-1开始
用运算符连接在一起用*运算符重复
列表中的元素是可以改变的
删除列表元素del list[2]
列表比较
import operatora [1, 2]
b [2, 3]
c [2, 3]
print(operator.eq(a,b): , operator.eq(a,b)) # False
print(operator.eq(c,b): , operator.eq(c,b)) # True6、Tuple元组
与列表类似不同之处在于元组的元素不能修改。 所谓元组的不可变指的是元组所指向的内存中的内容不可变 重新赋值的元组变量绑定到了新的对象不是修改了原来的对象了 元组写在小括号 () 里元素之间用逗号隔开
元组也可以被索引和切片也可以使用操作符进行拼接 可以把字符串看作一种特殊的元组 虽然tuple的元素不可改变但它可以包含可变的对象比如list列表
构造包含 0 个或 1 个元素的元组比较特殊所以有一些额外的语法规则
tup1 () # 空元组
tup2 (20,) # 一个元素需要在元素后添加逗号string、list 和 tuple 都属于 sequence序列
7、Set集合
集合set由一个或数个形态各异的大小整体组成的
构成集合的事物或对象称作元素或是成员
基本功能进行成员关系测试和删除重复元素
可以使用大括号 { } 或者 set() 函数创建集合 创建一个空集合必须用 set() 因为 { } 是用来创建一个空字典 parame {value01,value02,...}
set(value)sites {Google, Taobao, Runoob, Facebook, Zhihu, Baidu}print(sites) # 输出集合重复的元素被自动去掉# 成员测试
if Runoob in sites :print(Runoob 在集合中)
else :print(Runoob 不在集合中)# set可以进行集合运算
a set(abracadabra)
b set(alacazam)print(a - b) # a 和 b 的差集
{r, b, d}print(a | b) # a 和 b 的并集
{b, c, a, z, m, r, l, d}print(a b) # a 和 b 的交集
{c, a}print(a ^ b) # a 和 b 中不同时存在的元素
{z, b, m, r, l, d}1添加元素
添加元素s.add( x )
添加元素、列表、元组、字典s.update( x ) x 可以有多个用逗号分开 2移除元素
不存在报错s.remove( x )
不存在不报错s.discard( x )
随机删一个s.pop() set 集合的 pop 方法会对集合进行无序的排列然后将这个无序排列集合的左面第一个元素进行删除 3其他操作
计算集合元素个数len(s)
清空集合s.clear()
判断元素是否在集合中存在x in s
8、Dictionary字典
列表是有序的对象集合字典是无序的对象集合 两者之间的区别在于字典当中的元素是通过键来存取的而不是通过偏移存取
字典是一种映射类型字典用 { } 标识它是一个无序的 键(key) : 值(value) 的集合。
键(key)必须使用不可变类型。 键必须不可变所以可以用数字字符串或元组充当而用列表就不行 在同一个字典中键(key)必须是唯一的。 创建时如果同一个键被赋值两次后一个值为准 注dict 作为 Python 的关键字和内置函数变量名不建议命名为 dict
dict {}
dict[one] 123
dict[2] 456print (dict[one]) # 输出键为 one 的值
print (dict[2]) # 输出键为 2 的值
print (dict) # 输出完整的字典
print (dict.keys()) # 输出所有键
print (dict.values()) # 输出所有值创建空字典使用 {}
修改字典
tinydict {Name: Runoob, Age: 7, Class: First}tinydict[Age] 8 # 更新 Age
tinydict[School] No.1 # 添加信息9、隐式类型转换
较低数据类型整数就会转换为较高数据类型浮点数以避免数据丢失
10、显式类型转换
int() 强制转换为整型
x int(1) # x 输出结果为 1
y int(2.8) # y 输出结果为 2
z int(3) # z 输出结果为 3float() 强制转换为浮点型
x float(1) # x 输出结果为 1.0
y float(2.8) # y 输出结果为 2.8
z float(3) # z 输出结果为 3.0
w float(4.2) # w 输出结果为 4.2str() 强制转换为字符串类型
x str(s1) # x 输出结果为 s1
y str(2) # y 输出结果为 2
z str(3.0) # z 输出结果为 3.0函数描述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)将一个整数转换为一个八进制字符串
四、推导式
1、什么是推导式
Python 推导式是一种独特的数据处理方式可以从一个数据序列构建另一个新的数据序列的结构体
列表(list)推导式字典(dict)推导式集合(set)推导式元组(tuple)推导式
2、列表推导式
[表达式 for 变量 in 列表]
[out_exp_res for out_exp in input_list][表达式 for 变量 in 列表 if 条件]
[out_exp_res for out_exp in input_list if condition]out_exp_res列表生成元素表达式可以是有返回值的函数。for out_exp in input_list迭代 input_list 将 out_exp 传入到 out_exp_res 表达式中。if condition条件语句可以过滤列表中不符合条件的值。
过滤掉长度小于或等于3的字符串列表并将剩下的转换成大写字母 names [Bob,Tom,alice,Jerry,Wendy,Smith]new_names [name.upper() for name in names if len(name)3]print(new_names)
[ALICE, JERRY, WENDY, SMITH]计算 30 以内可以被 3 整除的整数 multiples [i for i in range(30) if i % 3 0]print(multiples)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]3、字典推导式
{ key_expr: value_expr for value in collection }{ key_expr: value_expr for value in collection if condition }提供三个数字以三个数字为键三个数字的平方为值来创建字典 dic {x: x**2 for x in (2, 4, 6)}dic
{2: 4, 4: 16, 6: 36}4、集合推导式
{ expression for item in Sequence }{ expression for item in Sequence if conditional }判断不是 abc 的字母并输出 a {x for x in abracadabra if x not in abc}a
{d, r}type(a)
class set5、元组推导式
(expression for item in Sequence )
或
(expression for item in Sequence if conditional )元组推导式和列表推导式的用法也完全相同只是元组推导式是用 () 圆括号将各部分括起来而列表推导式用的是中括号 []
元组推导式返回的结果是一个生成器对象 a (x for x in range(1,10))a
generator object genexpr at 0x7faf6ee20a50 # 返回的是生成器对象 tuple(a) # 使用 tuple() 函数可以直接将生成器对象转换成元组
(1, 2, 3, 4, 5, 6, 7, 8, 9)五、运算符
1、算数运算符
运算符说明加 - 两个对象相加-减 - 得到负数或是一个数减去另一个数*乘 - 两个数相乘或是返回一个被重复若干次的字符串/除 - x 除以 y%取模 - 返回除法的余数**幂 - 返回x的y次幂//取整除 - 向下取接近商的整数
2、比较运算符
运算符描述实例等于 - 比较对象是否相等(a b) 返回 False。!不等于 - 比较两个对象是否不相等(a ! b) 返回 True。大于 - 返回x是否大于y(a b) 返回 False。小于 - 返回x是否小于y。(a b) 返回 True。大于等于 - 返回x是否大于等于y。(a b) 返回 False。小于等于 - 返回x是否小于等于y。(a b) 返回 True。
所有比较运算符返回1表示真返回0表示假。这分别与特殊的变量True和False等价。
3、赋值运算符
运算符描述实例赋值运算符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 版本新增运算符
List [r,e,x,h,a,o]
for i in range(Len : len(List)):print(List[i],end)
# rexhao4、位运算符摆烂
运算符描述实例按位与运算符参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0(a b) 输出结果 12 二进制解释 0000 1100|按位或运算符只要对应的二个二进位有一个为1时结果位就为1。(a | b) 输出结果 61 二进制解释 0011 1101^按位异或运算符当两对应的二进位相异时结果为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
5、逻辑运算符
运算符逻辑表达式描述实例andx and y布尔与 - 如果 x 为 Falsex 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
6、成员运算符
运算符描述实例in如果在指定的序列中找到值返回 True否则返回 False。x 在 y 序列中 , 如果 x 在 y 序列中返回 True。not in如果在指定的序列中没有找到值返回 True否则返回 False。x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。
7、身份运算符
运算符描述实例isis 是判断两个标识符是不是引用自一个对象x is y, 类似 id(x) id(y) , 如果引用的是同一个对象则返回 True否则返回 Falseis notis not 是判断两个标识符是不是引用自不同对象x is not y 类似 id(x) ! id(y)。如果引用的不是同一个对象则返回结果 True否则返回 False。
id()获取对象内存地址。 is 与 区别is 用于判断两个变量引用对象是否为同一个 用于判断引用变量的值是否相等。 8、运算符优先级
运算符描述(expressions...),[expressions...], {key: value...}, {expressions...}圆括号的表达式x[index], x[index:index], x(arguments...), x.attribute读取切片调用属性引用await xawait 表达式**乘方(指数)x, -x, ~x正负按位非 NOT*, , /, //, %乘矩阵乘除整除取余, -加和减, 移位按位与 AND^按位异或 XORin,not in, is,is not, , , , , !, 比较运算包括成员检测和标识号检测not x逻辑非 NOTand逻辑与 ANDor逻辑或 ORif -- else条件表达式lambdalambda 表达式:赋值表达式 Pyhton3 已不支持 运算符 六、分支
1、if
Python 中用 elif 代替了 else if所以if语句的关键字为if - elif - else
使用缩进来划分语句块相同缩进数的语句在一起组成一个语句块。 在Python中没有switch – case语句。 2、while 在 Python 中没有 do…while 循环 使用 CTRLC 来退出死循环
支持while - else语句break跳出不执行else
3、for
for 循环用来遍历任何可迭代对象
break 语句用于跳出当前循环体
range(起始值, 结束值, 步长)创建数字序列
4、pass
pass是空语句是为了保持程序结构的完整性。
pass 不做任何事情一般用做占位语句空着会报错
5、迭代器
1迭代器概述
迭代用来访问集合字符串列表或元组对象元素
迭代器一个可以记住遍历的位置的对象
迭代器对象从集合的第一个元素开始访问直到所有的元素被访问完结束只能往前不会后退
迭代器的两个基本的方法iter() 和 next()
list[1,2,3,4]
it1 iter(list) # 创建迭代器对象
print (next(it1)) # 输出迭代器的下一个元素
# 1it2 iter(list) # 创建迭代器对象
for x in it2:print (x, end)
# 1234
2迭代器创建
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__()
__iter__() 返回一个特殊的迭代器对象 这个迭代器对象实现了 __next__() 并通过 StopIteration 异常标识迭代的完成
__next__() 会返回下一个迭代器对象
创建一个返回数字的迭代器初始值为 1逐步递增 1
class MyNumbers:def __iter__(self):self.a 1return selfdef __next__(self):x self.aself.a 1return xmyclass MyNumbers()
myiter iter(myclass)print(next(myiter))3StopIteration
StopIteration 异常用于标识迭代的完成防止出现死循环
import sys # 引入 sys 模块list[1,2,3,4]
it iter(list) # 创建迭代器对象while True:try:print (next(it))except StopIteration:sys.exit()在__next__()方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代
class MyNumbers:def __iter__(self):self.a 1return selfdef __next__(self):if self.a 20:x self.aself.a 1return xelse:raise StopIterationmyclass MyNumbers()
myiter iter(myclass)for x in myiter:print(x)6、生成器
生成器使用了 yield 的函数
生成器是一个返回迭代器的函数只能用于迭代操作更简单点理解生成器就是一个迭代器
在调用生成器运行的过程中每次遇到 yield 时函数会暂停并保存当前所有的运行信息返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行
# 使用 yield 实现斐波那契数列
import sysdef fibonacci(n): # 生成器函数 - 斐波那契a, b, counter 0, 1, 0while True:if (counter n): returnyield aa, b b, a bcounter 1
f fibonacci(10) # f 是一个迭代器由生成器返回生成while True:try:print (next(f), end )except StopIteration:sys.exit()七、函数
1、定义函数
def 函数名参数列表:函数体return [表达式] 结束函数选择性地返回一个值给调用方 不带表达式的 return 相当于返回 None
2、传参
1值传递和引用传递
类型属于对象对象有不同类型的区分变量是没有类型的
**不可变类型**类似 C 的值传递如整数、字符串、元组。**可变类型**类似 C 的引用传递如 列表、字典。 python 中一切都是对象严格意义我们不能说值传递还是引用传递我们应该说传不可变对象和传可变对象 2必需参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样
3关键字参数
关键字参数允许函数调用时参数的顺序与声明时不一致解释器能够用参数名匹配参数值
def printinfo( name, age ):print (名字: , name)print (年龄: , age)returnprintinfo( age50, namewmh )4默认参数
调用函数时如果没有传递参数则会使用默认参数
def printinfo( name, age 35 ):print (名字: , name)print (年龄: , age)returnprintinfo( namewmh )5不定长参数
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数和上述 2 种参数不同声明时不会命名。
def functionname([formal_args,] *var_args_tuple ):function_suitereturn [expression]星号 * 的参数会以元组(tuple)的形式导入存放所有未命名的变量参数
def printinfo( arg1, *vartuple ):print (arg1)print (vartuple)returnprintinfo( 70, 60, 50 )
# 70
# (60, 50)加了两个星号 ** 的参数会以字典的形式导入
def printinfo( arg1, **vardict ):print (输出: )print (arg1)print (vardict)returnprintinfo(1, a2,b3)
# 1
# {a: 2, b: 3}参数中星号 * 可以单独出现
def f(a,b,*,c):return abc
f(1,2,3) # 报错
f(1,2,c3) # 正常3、匿名函数
使用 lambda 来创建匿名函数
lambda 函数拥有自己的命名空间且不能访问自己参数列表之外或全局命名空间里的参数 虽然 lambda 函数看起来只能写一行却不等同于 C 或 C 的内联函数后者的目的是调用小函数时不占用栈内存从而增加运行效率 lambda [arg1 [,arg2,.....argn]]:expressionsum lambda a,b: a b
sum(1,2) # 34、强制位置参数
Python3.8 新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数不能使用关键字参数的形式
def f(a, b, /, c, d, *, e, f):print(a, b, c, d, e, f)return
f(10, 20, 30, d40, e50, f60) # 对
f(10, b20, c30, d40, e50, f60) # 错b 不能使用关键字参数的形式
f(10, 20, 30, 40, 50, f60) # 错e 必须使用关键字参数的形式