函数就是包裹一部分的代码,实现某一个功能,达成某一个目的,而且当这段代码如果使用或者重复使用的时候,只需要很简单的调用即可,大大减少了代码的维护难度。
可以反复调用,提高代码的复用性,提升开发效率,便于维护管理。
函数的定义要使用到关键字 def
,且函数定义不会执行函数中的代码,而是需要调用函数才会执行。
定义函数在关键字 def
后面加上函数名,然后后面加上括号,括号中可以酌情选择是否写上参数,在对应的作用域中写上代码。
语法:
def function_name([parameter0],[parameter1]):
code0
code1
code2
......
直接使用定义好的函数的函数名加上括号,括号中写上对应的参数,就会执行作用域中的代码。
语法:
funciton_name([parameter0],[parameter1])
注意,只要函数只有在调用的时候才能执行其中的代码
定义一个没有参数的函数
定义函数
def func():
print('this is function')
调用函数
func() # this is function
带有参数的函数
定义函数
def func(name):
print('this is ' + name)
调用函数
func('msr20666') # this is msr20666
函数的命名和变量命名的规则是一样的,推荐使用小驼峰命名法。
函数的参数,是配合函数运算的值。在函数中的代码使用参数的时候,就和使用变量的方法是一样的。
定义函数的时候的参数叫做形式参数,形参就就相当于定义变量的变量名,填的参数只是为了确定功能,所以叫作形式参数;调用函数的时候的参数叫做实际参数,实参就相当于定义变量的时候的值,这个时候的参数具有实际的作用,所以叫作实际参数。
形参 实参 普通形参 普通实参 默认形参 关键字实参 普通收集形参 命名关键字形参 关键字收集形参
函数调用的时候的参数要和定义的时候一一对应。
普通形参就是定义函数时在括号内直接写参数名,普通形参没有赋予值,所以在函数调用的时候必须要对普通形参赋予值,否则报错。
调用函数的时候直接写上的值就是普通实参。
直接写上参数名就是普通形参
def myName(name):
res = 'My name is %s' % name
print(res)
my_name = 'msr'
调用函数的时候直接写上的值就是普通实参
myName(my_name)
参数要一一对应,所以调用函数的时候不写参数就会报错
myName() # error
默认形参就是在定义函数的时候,参数就指定了一个值,换句话说默认形参就是一个带有默认值的普通形参。在调用函数的时候如果给默认参数指定了值,默认参数的实际值就是调用处的值,如果没有赋予值,默认参数的值就是定义处的值。
定义函数的时候带有默认值的就是默认参数
def myName(name='msr'):
res = 'My name is %s' % name
print(res)
调用处指定值
my_name = 'msr20666'
myName(my_name) # My name is msr20666
调用处不指定值
myName() # My name is msr
当普通参数和默认参数他同时存在的时候,默认参数必须要在普通参数的后面,否则报错。
def myName(name, name1='msr'):
print(name, name1)
myName('wxd',) # wxd msr
普通实参就是在调用函数的时候直接填写值,这样的赋值不能打乱顺序,要按照形参定义的顺序来写。
关键字实参是对具体的某个参数赋值,这样就可以打乱参数的顺序使用,但是全部使用关键字实参必须将所有普通形参全部使用关键字实参,否则报错
def name(name1, name2, name3, name4='没有名字'):
print(name1, name2, name3, name4)
普通实参
name(111, 222, 333, 444) # 111 222 333 444
关键字实参
name(name2=444, name1=222, name3=111, name4=333) # 222 444 111 333
普通实参和关键字实参一起使用的时候,关键字实参也是不能写在普通实参的前面的。
注意要区分默认形参和关键字实参,默认形参和关键字实参在语法上是一模一样的,都是给某个参数一个固定的值,且都必须跟在普通形参和实参之后。但是区分的方法很简单,默认形参是形式参数,在定义函数时的就是默认形参,关键字实参是实际参数,在调用函数时的就是关键字实参。
函数的实参要和形参一一对应,如果有普通实参没有对应的形参,普通收集参数就可以用来专门收集多余的普通实参,在普通形参的前面加上一个 *
就是普通收集参数,普通收集参数一般习惯命名为 args
。收集的数据会变成一个元组。
def func(name, *args):
print(name) # msr
print(args) # (1, 2, 3, 4, 5, 6)
func('msr', 1, 2, 3, 4, 5, 6)
关键字收集参数和普通收集参数的作用和普通收集参数的租用基本相同的,只不过关键字收集参数收集的是关键字实参,关键字收集参数在普通形参的前面加上 **
符号,一般命名为 kwargs
,收集的数据变成一个字典。
def func(*args, **kwargs):
print(args)
print(kwargs)
func(1, 2, 3, 4, name='msr', age=18, sex=0)
'''
结果:
(1, 2, 3, 4)
{'name': 'msr', 'age': 18, 'sex': 0}
'''
普通收集参数和关键字参数一起可以收集所有的实参
收集所有的实参
def func(*args, **kwargs):
print(args)
print(kwargs)
命名关键字参数就是在函数调用的时候,必须使用关键字实参进行赋值的形参。
定义命名关键字参数的两种方式:
def function_name(parameter, *, parameter2)
参数2是命名关键字, * 后面的参数为命名关键字def function_name(*args, parameter, kwargs)**
parameter是命名关键字,普通收集参数后面的普通形参是命名关键字参数
方法一, * 本身不是一个参数:
def func(*, a, b, c, d):
print(a, b, c, d) # A B C D
func(a='A', b='B', c='C', d='D')
方法二:
def func(*args, a, b, c):
print(a, b, c) # 3 4 2
func(a=3, b=4, c=2)
-
和 ** 在函数的定义处,用来做收集操作,打包
-
和 ** 在函数的调用处,用来做打散操作,解包
-
在定义处用来收集普通实参,成为元组;在调用处用来打散容器成为普通实参,如果是字典,只获取键。
** 在定义处用来收集关键字实参,成为字典;在调用处用来打散字典(只能是字典,且键为字符串)成为关键字实参。
def func(*args):
print(args)
lst = [1, 2, 3, 4, 5, 6]
如果将列表直接作为参数放入,lst就是一个参数
func(lst) # ([1, 2, 3, 4, 5, 6],)
如果在lst前面加上 * ,就将列表列表解包,每一个元素都是一个参数
func(*lst) # (1, 2, 3, 4, 5, 6)
相当于将列表中的元素一个个拿出,当成一个个普通实参给函数进行调用,**也是一样的。
def func(**kwargs):
print(kwargs)
dct = {'one': 1, 'two': 2, 'three': 3}
** 可以解包字典
func(**dct) # {'one': 1, 'two': 2, 'three': 3}
return可以返回自定义函数的值,叫做返回值,可以把函数最终运算出的结果返回到函数的调用处。
不指定return返回值,返回None。
定义函数
def func():
print('hello')
调用函数
函数执行打印'hello',没有定义返回值,返回None给res
res = func()
print(res)
'''
结果:
hello
None
'''
定义返回值。
定义函数
def func():
print('hello')
return 'motherland'
调用函数,返回'motherland'给res
res = func()
print(res)
'''
结果:
hello
motherland
'''
执行return之后,函数后面未执行的代码不再执行。
定义函数
def func():
print(1)
return 2
print(3)
调用函数
func()
'''
结果:
1
'''
python中的函数可以像变量一样,动态创建销毁,当作参数传递,作为值返回,叫第一类对象,其他语言功能有限。
在定义函数的时候,在函数的上方使用单行注释、或者在下方使用多行注释可以为函数注释说明。
可以使用 __doc__
方法或者是 help
函数查看。
使用 help
函数查看在函数的注释说明。
这是我的第一个函数
函数的注释在上方
def func():
pass
print(help(func))
'''
结果:
Help on function func in module __main__:
func()
# 这是我的第一个函数
# 函数的注释在上方
None
'''
使用 __doc__
方法查看。
def func():
"""
这是我的第二个函数
函数的注释在下方
"""
pass
使用
print(func.__doc__)
'''
结果:
这是我的第二个函数
函数的注释在下方
'''
形参在一起使用的时候要哪找顺序。
普通参数 -> 默认参数 -> 普通收集参数 -> 命名关键字参数 -> 关键字收集参数
Original: https://www.cnblogs.com/msr20666/p/16059279.html
Author: 小小垂髫
Title: python函数基础
相关阅读1
Title: Python ❀ while循环
1、Input函数
函数input()可以让程序暂停运行,等待输入一些文本内容,获取输入后,Python将获取到的内容存储在一个变量中,方便后续的使用;
输出结果:
1.1 使用换行符
输出结果:
1.2 切换输入类型
由于input()函数的输出类型为字符串类型,因此在输入整数或浮点数时,需要进行数据类型转换;
输出结果:
2、While循环
for循环用于针对集合中的每个元素的一个代码块,而while循环则是通过不断的运行,直到指定条件不满足或手动退出循环为止;
2.1 使用While循环
使用while循环遍历整数;
输出结果:
2.2 循环的退出
在使用while循环时,如果想让循环手动退出则可以设置一个退出条件;当然也可以使用break与continue;
输出结果:
立即退出循环,不再运行循环剩余代码,无论测试条件结果如何直接退出;
输出结果:
返回到循环的开头,并根据条件测试结果决定是否继续执行循环代码;
输出结果:
3、While处理列表和字典
for循环是一种遍历列表的有效方式,但是不推荐使用for循环修改列表,否则将难以跟踪其中的元素,如果在遍历列表的同时对其进行修改,可以使用while循环;
3.1 列表之间移动元素
创建两个列表,其中一个为空列表,将列表1的值依次添加到列表2中,并删除列表1中的值;
输出结果:
3.2 删除包含特定值的所有列元素
删除某个列表中的重复项;
输出结果:
3.3 用户输入填充字典
创建一个空白字典,重复输入键值对,并确认是否继续输入键值对;
输出结果:
Original: https://blog.51cto.com/u_14814563/5415641
Author: 无糖可乐没有灵魂
Title: Python ❀ while循环
相关阅读2
Title: Python 函数进阶-lambda匿名函数和三元运算符
匿名函数
什么是匿名函数
用一句话表达只有返回值的函数就是匿名函数。
匿名函数只用来实现一些简单的函数功能,所以追求代码的简洁和高效。
使用关键字 lambda
定义,所以匿名函数又称之为lambda表达式。
分类
- 无参数的
lambda
表达式
# 普通函数
def func():
return 'hello motherland'
# 调用
res = func()
print(res) # hello motherland
# lambda表达式
func = lambda: 'hello motherland'
# 调用
res = func()
print(res) # hello motherland
- 有参数的
lambda
表达式
# 普通函数
def func(val):
return val
# lambda表达式
func = lambda val: val
- 带有判断条件的
lambda
表达式
def func(val):
if val == 0:
return 'yes'
return 'no'
# lambda表达式
func = lambda val: 'yes' if val == 0 else 'no'
三元运算符
三元运算符一般又称之为三目运算符。它是软件编程中的一种固定格式,是众多编程语言中不可或缺的一种逻辑判断算法,逻辑概念就是一个简单的if条件判断语句,使用这个算法可以调用数据时可以逐级筛选。
语法:条件成立表达式 ? 条件判断式 : 条件反式
众多语言中一般使用 …… ? …… : ……
符号作为三元运算符,但是python不是这样,python中使用 …… if ……… else ………
作为三元运算符的使用, 这也体现了python比其它的语言的优势,更简单的语法和更高的语句可视化。
语法:lambda [参数] : 真值 if 条件表达式 else 假值
如果条件表达式成立,返回真值,反之返回假值
res = 'yes' if 1 == 1 else 'no'
print(res) # yes
Original: https://www.cnblogs.com/msr20666/p/16159465.html
Author: 小小垂髫
Title: Python 函数进阶-lambda匿名函数和三元运算符
相关阅读3
Title: 用python开发一个益智游戏,没事就锻炼锻炼自己的方向感
兄弟们,爬虫爬多了,对身体不好,也要考虑劳逸结合,偶尔换换口味。
今天来感受一下用python来开发一款益智游戏,来吃够!
; 准备一下
软件环境,咱们还是用python和pycharm即可。
模块的话,没有安装的安装一下 cfg 和 pygame 模块。
win+r 打开运行框输入 cmd 按回车弹出命令提示符窗口,输入pip install 模块名,如 pip install pygame 然后按回车即可安装成功。
这一步我真的写了太多次了,就是怕有零基础的老铁不会,每次都写,害。
代码展示
然后咱们直接来吧展示
模块导入
import cfg
import pygame
from modules.misc import *
from modules.mazes import *
from modules.Sprites import *
# Python学习交流群:815624229
主函数
初始化
pygame.init()
pygame.mixer.init()
pygame.font.init()
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1, 0.0)
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('迷宫益智小游戏')
font = pygame.font.SysFont('Consolas', 15)
开始界面
Interface(screen, cfg, 'game_start')
记录关卡数
num_levels = 0
记录最少用了多少步通关
best_scores = 'None'
关卡循环切换
while True:
num_levels += 1
clock = pygame.time.Clock()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
随机生成关卡地图
maze_now = RandomMaze(cfg.MAZESIZE, cfg.BLOCKSIZE, cfg.BORDERSIZE)
生成hero
hero_now = Hero(cfg.HEROPICPATH, [0, 0], cfg.BLOCKSIZE, cfg.BORDERSIZE)
统计步数
num_steps = 0
关卡内主循环
while True:
dt = clock.tick(cfg.FPS)
screen.fill((255, 255, 255))
is_move = False
↑↓←→控制hero
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit(-1)
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
is_move = hero_now.move('up', maze_now)
elif event.key == pygame.K_DOWN:
is_move = hero_now.move('down', maze_now)
elif event.key == pygame.K_LEFT:
is_move = hero_now.move('left', maze_now)
elif event.key == pygame.K_RIGHT:
is_move = hero_now.move('right', maze_now)
num_steps += int(is_move)
hero_now.draw(screen)
maze_now.draw(screen)
显示一些信息
showText(screen, font, 'LEVELDONE: %d' % num_levels, (255, 0, 0), (10, 10))
showText(screen, font, 'BESTSCORE: %s' % best_scores, (255, 0, 0), (210, 10))
showText(screen, font, 'USEDSTEPS: %s' % num_steps, (255, 0, 0), (410, 10))
showText(screen, font, 'S: your starting point D: your destination', (255, 0, 0), (10, 600))
判断游戏是否胜利
if (hero_now.coordinate[0] == cfg.MAZESIZE[1] - 1) and (hero_now.coordinate[1] == cfg.MAZESIZE[0] - 1):
break
pygame.display.update()
更新最优成绩
if best_scores == 'None':
best_scores = num_steps
else:
if best_scores > num_steps:
best_scores = num_steps
关卡切换
Interface(screen, cfg, mode='game_switch')
run
if __name__ == '__main__':
main(cfg)
效果展示
截个图算了,视频我就不录了
然后这个游戏的话,需要一些素材文件,大家在导入模块那部分可以领到
记得点赞收藏哈
Original: https://www.cnblogs.com/hahaa/p/16027040.html
Author: 轻松学Python
Title: 用python开发一个益智游戏,没事就锻炼锻炼自己的方向感