首页
关于
Search
1
python打包-Nuitka快速上手
107 阅读
2
python打包-pystand快速上手
23 阅读
3
python打包-pyinstaller快速上手
18 阅读
4
开始我的python学习之路
17 阅读
5
python学习记录第25天
10 阅读
默认分类
登录
Search
Typecho
累计撰写
29
篇文章
累计收到
32
条评论
首页
栏目
默认分类
页面
关于
搜索到
29
篇与
的结果
2023-05-01
python学习记录第18天
5.2. 【基础】11个案例讲解函数参数1. 参数分类函数,在定义的时候,可以有参数的,也可以没有参数。从函数定义的角度来看,参数可以分为两种:必选参数:调用函数时必须要指定的参数,在定义时没有等号可选参数:也叫默认参数,调用函数时可以指定也可以不指定,不指定就默认的参数值来。例如下面的代码中,a 和 b 属于必选参数, c 和 d 属于可选参数def func(a,b,c=0, d=1): pass从函数调用的角度来看,参数可以分为两种:关键字参数:调用时,使用 key=value 形式传参的,这样传递参数就可以不按定义顺序来。位置参数:调用时,不使用关键字参数的 key-value 形式传参,这样传参要注意按照函数定义时参数的顺序来。def func(a,b,c=0, d=1): pass # 关键字参数传参方法 func(a=10, c=30, b=20, d=40) # 位置参数传参方法 func(10, 20, 30, 40)最后还有一种非常特殊的参数,叫做可变参数。意思是参数个数可变,可以是 0 个或者任意个,但是传参时不能指定参数名,通常使用 *args 和 **kw 来表示:*args:接收到的所有按照位置参数方式传递进来的参数,是一个元组类型**kw :接收到的所有按照关键字参数方式传递进来的参数,是一个字典类型def func(*args, **kw): print(args) print(kw) func(10, 20, c=20, d=40)输出如下(10, 20) {'c': 20, 'd': 40}2. 十一个案例案例一:在下面这个函数中, a 是必选参数,是必须要指定的>>> def demo_func(a): ... print(a) ... >>> demo_func(10) 10 >>> demo_func() # 不指定会报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: demo_func() missing 1 required positional argument: 'a'案例二:在下面这个函数中,b 是可选参数(默认参数),可以指定也可以不指定,不指定的话,默认为10>>> def demo_func(b=10): ... print(b) ... >>> demo_func(20) 20 >>> demo_func() 10案例三:在下面这个函数中, name 和 age 都是必选参数,在调用指定参数时,如果不使用关键字参数方式传参,需要注意顺序>>> def print_profile(name, age): ... return f"我的名字叫{name},今年{age}岁了" ... >>> print_profile("王炳明", 27) '我的名字叫王炳明,今年27岁了'如果参数太多,你不想太花精力去注意顺序,可以使用关键字参数方式传参,在指定参数时附上参数名,比如这样:>>> print_profile(age=27, name="王炳明") '我的名字叫王炳明,今年27岁了'案例四:在下面这个函数中,args 参数和上面的参数名不太一样,在它前面有一个 *,这就表明了它是一个可变参数,可以接收任意个数的不指定参数名的参数。>>> def demo_func(*args): ... print(args) ... >>> >>> demo_func(10, 20, 30) (10, 20, 30)案例五:在下面这个函数中,kw 参数和上面的 *args 还多了一个 * ,总共两个 ** ,这个意思是 kw 是一个可变关键字参数,可以接收任意个数的带参数名的参数。>>> def demo_func(**kw): ... print(kw) ... >>> demo_func(a=10, b=20, c=30) {'a': 10, 'b': 20, 'c': 30}案例六:在定义时,必选参数一定要在可选参数的前面,不然运行时会报错>>> def demo_func(a=1, b): ... print(a, b) ... File "<stdin>", line 1 SyntaxError: non-default argument follows default argument >>> >>> def demo_func(a, b=1): ... print(a, b) ... >>>案例七:在定义时,可变位置参数一定要在可变关键字参数前面,不然运行时也会报错>>> def demo_func(**kw, *args): File "<stdin>", line 1 def demo_func(**kw, *args): ^ SyntaxError: invalid syntax >>> >>> def demo_func(*args, **kw): ... print(args, kw) ... >>> 案例八:可变位置参数可以放在必选参数前面,但是在调用时,必选参数必须要指定参数名来传入,否则会报错>>> def demo_func(*args, b): ... print(args) ... print(b) ... >>> demo_func(1, 2, 100) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: demo_func() missing 1 required keyword-only argument: 'b' >>> >>> demo_func(1, 2, b=100) (1, 2) 100案例九:可变关键字参数则不一样,可变关键字参数一定得放在最后,下面三个示例中,不管关键字参数后面接位置参数,还是默认参数,还是可变参数,都会报错。>>> def demo_func(**kw, a): File "<stdin>", line 1 def demo_func(**kw, a): ^ SyntaxError: invalid syntax >>> >>> def demo_func(**kw, a=1): File "<stdin>", line 1 def demo_func(**kw, a=1): ^ SyntaxError: invalid syntax >>> >>> def demo_func(**kw, *args): File "<stdin>", line 1 def demo_func(**kw, *args): ^ SyntaxError: invalid syntax案例十:将上面的知识点串起来,四种参数类型可以在一个函数中出现,但一定要注意顺序def demo_func(arg1, arg2=10, *args, **kw): print("arg1: ", arg1) print("arg2: ", arg2) print("args: ", args) print("kw: ", kw)试着调用这个函数,输出如下:>>> demo_func(1,12, 100, 200, d=1000, e=2000) arg1: 1 arg2: 12 args: (100, 200) kw: {'d': 1000, 'e': 2000}案例十一:使用单独的 *,当你在给后面的位置参数传递时,对你传参的方式有严格要求,你在传参时必须要以关键字参数的方式传参数,要写参数名,不然会报错。>>> def demo_func(a, b, *, c): ... print(a) ... print(b) ... print(c) ... >>> >>> demo_func(1, 2, 3) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: demo_func() takes 2 positional arguments but 3 were given >>> >>> demo_func(1, 2, c=3) 1 2 33. 传参的坑函数参数传递的是实际对象的内存地址。如果参数是引用类型的数据类型(列表、字典等),在函数内部修改后,就算没有把修改后的值返回回去,外面的值其实也已经发生了变化。>>> def add_item(item, source_list): ... source_list.append(item) ... >>> alist = [0,1] >>> add_item(2, alist) >>> alist [0, 1, 2]
2023年05月01日
3 阅读
0 评论
1 点赞
2023-04-30
python学习记录第17天
5.1 【基础】普通函数创建与调用函数是一种仅在调用时运行的代码块。您可以将数据(称为参数)传递到函数中,然后由函数可以把数据作为结果返回。如果将函数比喻成蛋糕店的话,那么函数的参数就是生产蛋糕的原材料,而函数的返回值就是蛋糕成品。1. 函数的创建在 Python 中,使用 def 关键字定义函数def 函数名(参数): # 内部代码 return 表达式 举个例子,我这边手动实现一个计算两个数平均值的函数,这边这样子写def get_average(a, b): ''' 计算平均值 ''' result = (a + b)/2 return result在定义函数的过程中,需要注意以下几点:函数代码块以def关键词开头,一个空格之后接函数标识符名称和圆括号(),再接个冒号。任何传入的参数必须放在圆括号中间。函数的第一行语句后可以选择性地使用文档字符串—用于存放函数说明。函数内容以冒号起始,并且缩进。使用return,返回值给调用者,并结束函数。return 关键并不是必须要加,可根据实际需要决定是否要写,若不写的话,默认返回None。return语句依然在函数体内部,不能回退缩进。直到函数的所有代码写完,才回退缩进,表示函数体结束。2. 函数的调用函数编写出来就是给人调用的。要调用一个函数,必须使用函数名后跟圆括号的方式才能调用函数。调用的同时要根据函数的定义体,提供相应个数和类型的参数,每个参数之间用逗号分隔。def get_average(a, b): ''' 计算平均值 ''' result = (a + b)/2 return result average = get_average(2, 6) print(average) # output: 44. 函数的返回函数的返回值,可以是多种多样的,非常灵活:可以是任意类型的对象,比如字符串,数值,列表,字典等等def demo_func(): return 10可以是一个表达式,函数会直接运行表达式,然后返回def get_average(a, b): return (a + b)/2可以是函数本身,利用这点可以实现递归调用。def fact(n): if n==1: return 1 return n * fact(n - 1)另外还可以返回多个值def demo_func(): return 1,2.3 可以是其他函数,利用这点可以实现装饰器。这部分属于进阶内容,感兴趣可查看另一章节内容:5.6 精通装饰器的八种用法def decorator(func): def wrapper(*args, **kw): return func() return wrapper
2023年04月30日
2 阅读
0 评论
1 点赞
2023-04-29
python学习记录第16天
4.4 【进阶】五种推导式推导式(英文名:comprehensions),也叫解析式,是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。总共有四种推导式:列表(list)推导式字典(dict)推导式集合(set)推导式生成器推导式1. 列表推导式列表推导式的基本格式new_list = [expression for_loop_expression if condition]举个例子。我想找出一个数值列表中为偶数的元素,并组成新列表,通常不用列表推导式,可以这么写old_list = [0,1,2,3,4,5] new_list = [] for item in old_list: if item % 2 == 0: new_list.append(item) print(new_list) # output: [0, 2, 4]一个简单的功能,写的代码倒是不少。如果使用了列表推导式,那就简洁多了,而且代码还变得更加易读了。>>> old_list = [0,1,2,3,4,5] >>> >>> new_list = [item for item in old_list if item % 2 == 0] >>> print(new_list) # output: [0, 2, 4] [0, 2, 4]2. 字典推导式字典推导式的基本格式,和 列表推导式相似,只是把 [] 改成了 {},并且组成元素有两个:key 和 value,要用 key_expr: value_expr 表示。new_dict ={ key_expr: value_expr for_loop_expression if condition }举个例子。我想从一个包含所有学生成绩信息的字典中,找出数学考满分的同学。old_student_score_info = { "Jack": { "chinese": 87, "math": 92, "english": 78 }, "Tom": { "chinese": 92, "math": 100, "english": 89 } } new_student_score_info = {name: scores for name, scores in old_student_score_info.items() if scores["math"] == 100} print(new_student_score_info) # output: {'Tom': {'chinese': 92, 'math': 100, 'english': 89}}3. 集合推导式集合推导式跟列表推导式也是类似的。 唯一的区别在于它使用大括号{},组成元素也只要一个。基本格式new_set = { expr for_loop_expression if condition }举个例子我想把一个数值列表里的数进行去重处理>>> old_list = [0,0,0,1,2,3] >>> >>> new_set = {item for item in old_list} >>> print(new_set) {0, 1, 2, 3}4. 生成器推导式生成器推导式跟列表推导式,非常的像,只是把 [] 换成了 ()列表推导式:生成的是新的列表生成器推导式:生成的是一个生成器直接上案例了,找出一个数值列表中所有的偶数>>> old_list = [0,1,2,3,4,5] >>> new_list = (item for item in old_list if item % 2 == 0) >>> new_list <generator object <genexpr> at 0x10292df10> >>> next(new_list) 0 >>> next(new_list) 25. 嵌套推导式for 循环可以有两层,甚至更多层,同样的,上面所有的推导式,其实都可以写成嵌套的多层推导式。但建议最多嵌套两层,最多的话,代码就会变得非常难以理解。举个例子。我想打印一个乘法表,使用两个for可以这样写for i in range(1, 10): for j in range(1, i+1): print('{}x{}={}\t'.format(j, i, i*j), end='') print("")输出如下1x1=1 1x2=2 2x2=4 1x3=3 2x3=6 3x3=9 1x4=4 2x4=8 3x4=12 4x4=16 1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81如果使用嵌套的列表推导式,可以这么写>>> print('\n'.join([' '.join(['%2d *%2d = %2d' % (col, row, col * row) for col in range(1, row + 1)]) for row in range(1, 10)])) 1 * 1 = 1 1 * 2 = 2 2 * 2 = 4 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9 1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16 1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25 1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36 1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49 1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64 1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81
2023年04月29日
2 阅读
0 评论
1 点赞
2023-04-28
python学习记录第15天
4.3 【基础】循环语句:whilewhile 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:while 判断条件: 执行语句1. 普通的循环直接上案例age = 1 while age <= 3: print(f"孩子当前 {age} 岁,还不能上幼儿园") age += 1 print("年龄够了,可以上幼儿园了")运行后,输出结果孩子当前 1 岁,还不能上幼儿园 孩子当前 2 岁,还不能上幼儿园 孩子当前 3 岁,还不能上幼儿园 年龄够了,可以上幼儿园了2. 无限的循环当 while 后面的条件一直满足且循环体内一直没有 break ,此时 while 就会变成死循环,就是写 while 循环时千万要注意的。会造成死循环,无非两种情况:1、 使用 while True,而且循环体内又没有 break 或者 走不到 breakage = 1 while True: age += 12、 使用一个永远都会成立的判断条件,而且循环体内又没有 break 或者 走不到 breakage = 1 while age > 0: age += 13. while - else 语句和 for 循环一样, while 循环同样可以加一个 else 分支,当代码在 while 循环体中正常执行完,就会走到 else 分支中。那么什么叫做 正常执行完 呢?就是只要不通过 break 语句中断的,都算正常执行完。>>> age = 1 >>> while age <= 3: ... print(f"我已经 {age} 岁了") ... age += 1 ... else: ... print("可以上幼儿园了") ... 我已经 1 岁了 我已经 2 岁了 我已经 3 岁了 可以上幼儿园了如果在循环体内加 break ,就算是异常退出age = 1while age <= 3:... if age == 2:... break... print(f"我已经 {age} 岁了")... age += 1... else:... print("可以上幼儿园了")...我已经 1 岁了
2023年04月28日
2 阅读
0 评论
1 点赞
2023-04-27
python学习记录第14天
4.2 【基础】循环语句:forfor 循环可以遍历任何序列的项目,如一个列表或者一个字符串。它的基本语法是for 元素 in 序列对象: 代码块1. 普通循环直接上案例>>> phones = ["Apple", "Huawei", "Xiaomi"] >>> for phone in phones: ... print("当前手机是: " + phone) ... 当前手机是: Apple 当前手机是: Huawei 当前手机是: Xiaomi2. 带索引循环如果想在循环的时候,把索引也取出来,可以加一个 enumerate 函数>>> phones = ["Apple", "Huawei", "Xiaomi"] >>> >>> for index,phone in enumerate(phones): ... print("我的第 {} 把手机是: {}".format(index+1, phone)) ... 我的第 1 把手机是: Apple 我的第 2 把手机是: Huawei 我的第 3 把手机是: Xiaomi3. break 中断正常情况下,我们都需要 for 循环能够全部循环完,但在某些情况下,需要中断循环的执行,中断循环使用的是 break 关键字。举个例子>>> for i in [0, 1, 2]: ... if i == 1: ... print(f"当前的数是 {i}, 将退出循环") ... break ... print("当前的数是 " + str(i)) ... 当前的数是 0 当前的数是 1, 将退出循环4. continue 下一循环在有些循环中,不需要把 for 的循环体内的代码全部执行完毕,这种情况下,可以使用 continue 关键字,直接进入下一循环。举个例子,下面的循环中当 i 等于 1 时,就直接跳过了循环。>>> for i in [0, 1, 2]: ... if i == 1: ... continue ... print("当前的数是 " + str(i)) ... 当前的数是 0 当前的数是 25. for - else 循环其实在 for 循环语句的后面,可以加一个 else 分支,当代码在 for 循环体中正常执行完,自然就会走到 else 分支中。那么什么叫做 正常执行完 呢?就是只要不通过 break 语句中断的,都算正常执行完。先以 continue 为例,所有的循环都非常正常,会走到 else 分支>>> for i in [0, 1, 2]: ... if i == 1: ... continue ... print("当前的数是 " + str(i)) ... else: ... print("循环非常正常") ... 当前的数是 0 当前的数是 2 循环非常正常再把 continue 改成 break 后,发现不会走到 else 分支for i in [0, 1, 2]:... if i == 1:... break... print("当前的数是 " + str(i))... else:... print("循环非常正常")...当前的数是 0
2023年04月27日
2 阅读
0 评论
1 点赞
1
2
3
4
...
6