Python基础之函数和模块
函数的基本使用
- 函数的定义:把具有独立功能的代码块组织成一个小模块,在需要的时候调用。或者说,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
- 函数的使用:1.定义函数;2.调用函数。
- 函数的作用:能提高应用的模块性,和代码的重复利用率。
- 自己创建函数,叫做用户自定义函数。
函数的快速体验
在一个py文件中定义一个函数,在另一个文件中,导入函数,调用函数。
定义函数:
hello_func.py
def hello():
print("hello world")
print("hello python")
调用函数:
sayhello.py
import hello_func
hello_func.hello()
函数定义的语法格式
def 函数名():
被封装的函数代码
函数的命名
- 函数名称,应该见名知意
- 应该符合 标识符的命名规则
- 由字母,数字,下划线组成
- 不能以数字开头
- 不能与关键字重名
函数的调用
直接 函数名() 即可;调用格式及示例如下:
# 函数名()
sayhello()
函数演练
def say_hello():
print("hello world 1")
print("hello world 2")
print("hello world 3")
say_hello()
函数的注意事项
函数被定义后并不会被运行,只是封装了函数而已,要使用函数需要调用函数。
当断点调试经过函数时,并不会执行,会跳过,只有当后面调用时,才会去函数中依次执行代码,执行完成后再重新回到调用函数后面的代码
先定义再调用;没定义函数就先调用,会报错;所以应该先定义函数,再调用函数;
f8和f7单步越过和单步进入;f8单步执行时,经过函数调用时会直接执行整的函数而不进入内部;
f7单步执行时,经过函数调用时会进入函数内部一步一步执行。
函数的文档注释
在函数定义下的第一行,添加连续的三对双引号,在双引号中间进行文字注释;
在函数调用处可以用ctrl+q,查看函数说明。
注释如下:
def say_hello():
"""输出三次打招呼"""
print("hello 黎明1")
print("hello 黎明2")
print("hello 黎明3")
函数的参数与返回值
无参数的函数示例
def sum2num():
num1 = 10
num2 = 20
s = num1 + num2
print("%d和%d的和为%d" % (num1, num2, s))
sum2num()
没有参数的函数只能计算固定的数字,过于死板,作用不大。
函数参数的使用
def sum2num(num1, num2):
"""将传进来的两个参数求和并输出"""
s = num1 + num2
print("%d和%d的和为%d" % (num1, num2, s))
sum2num(10, 20) # 10和20的和为30
sum2num(30, 45) # 30和45的和为75
参数的使用:在函数名后面的小括号内填写参数,多个参数之间用逗号分隔;
参数的作用:
增加函数的通用性,真毒以相同的数据处理逻辑,能够适应更多的数据。
1.在函数内部,把参数当做变量使用,进行需要的数据处理;
2.函数调用时,按照函数定义的参数顺序,把希望在函数内部处理的数据,通过参数传递。
形参和实参
定义函数时传递的参数叫形参,用来接收参数用的,在函数内部作为变量使用;
调用函数时传递的参数叫实参,用来把数据传到函数内部;
例如:
def sum2num(num1, num2): # 这里的就是形参,即形式参数,一个架子,同时函数内部使用的,都是形参
s = num1 + num2
print("%d和%d的和为%d" % (num1, num2, s))
sum2num(10, 20) # 这里的就是实参,即实际传送的参数
sum2num(30, 45) # 这里的就是实参,即实际传送的参数
函数返回值
- 函数在执行后,返回给调用者函数执行的结果,方便调用者针对返回结果做相应的处理;
- 在函数中想要返回结果,用一个return 加上要返回的结果即可;
- 在调用函数后,想要函数返回的结果,用一个变量接收即可。
接收函数的返回值示例
def sum2num(num1, num2):
"""将传进来的两个参数求和并返回结果"""
s = num1 + num2
# 可以用返回值,告诉调用者计算结果
return s
# 可以用变量接收函数的返回结果
result = sum2num(10, 20)
print("计算结果为:%d" % result)
return关键字的注意事项:return表示返回,后面的函数代码都不会被执行(无法到达),应注意别在return下面写代码
函数的嵌套调用
函数嵌套调用示例
函数的嵌套调用示例
def test1():
print("*"*50)
def test2():
print("-"*50)
test1()
print("+"*50)
test2()
# 执行结果如下
# --------------------------------------------------
# **************************************************
# ++++++++++++++++++++++++++++++++++++++++++++++++++
参数与分割线的打印示例
# 版本1
# def print_line():
# print("*" * 50)
# print_line()
# 版本2
# def print_line(char):
# print(char * 50)
# print_line("-")
# 版本3
def print_line(char, times):
print(char * times)
print_line("hi ", 50)
打印多行分割线示例
def print_line(char, times):
print(char * times)
def print_lines():
row = 1
while row <= 5:
print_line("-", 50)
row += 1
print_lines()
按需打印分割线示例
def print_line(char, times):
print(char * times)
def print_lines(char, times, lines):
row = 1
while row <= lines:
print_line(char, times)
row += 1
print_lines("-", 40, 6)
print_lines("+", 50, 6)
给函数增加文档注释
当参数过多或者过久了再看代码,极有可能会忘记各个参数代表什么,因此很有必要添加文档注释;
增加函数文档注释有两种方法:
- 当函数写完后,在def下一行添加三个一对双引号,回车,系统就会自动帮你生成含函数参数的部分注释,再加上自己的注释即可;
- 点击函数名,将鼠标移动到出现的灯泡处,会有一个小三角,点击找到 给函数添加短文档注释,然后添加自己的注释即可。
添加文档注释后效果如下:
def print_line(char, times):
"""
:param char:用于分割的字符
:param times:每行分割字符的数量
:return:
"""
print(char * times)
def print_lines(char, times, lines):
"""
按照客户需求打印分割线,完全自定义打印多少行,什么分隔符,每行多少个分隔符
:param char: 用于分割的字符
:param times: 每行分割字符的数量
:param lines: 打印分割线的行数
:return:
"""
row = 1
while row <= lines:
print_line(char, times)
row += 1
print_lines("-", 40, 6)
print_lines("+", 50, 6)
eval函数
eval函数的介绍和简单使用
eval()函数十分强大,能够将字符串当成有效的表达式来求值并返回计算结果;
# 基本的数学计算
print(eval("1+1"))
# 字符串重复
print(eval("'*'*10"))
# 将用户输入的字符串转换为字典
userinfo = input("请输入一个字典:")
print(type(eval(userinfo)))
# 2
# **********
# 请输入一个字典:{"name":"zhangsan", "age":"18"}
# <class 'dict'>
eval函数计算题示例:
user_str = input("请输入一个算术题:")
print(eval(user_str))
# 请输入一个算术题:(2+3)*5
# 25
谨慎使用eval函数
不滥用eval,防止代码注入
在开发时千万不要使用eval直接转换input的结果;
在讲为什么之前先了解前置知识:
__import__('os').system('ls')
等价于
import os
os.system("ls")
执行成功,返回0;
执行失败,返回错误信息;
那么,加入用户用这个恶意攻击你的系统?
user_str = input("请输入一个算术题:")
print(eval(user_str))
# 请输入一个算术题:__import__('os').getcwd()
# E:\Pycharm\xxx\xxx\04文件操作
# 请输入一个算术题:__import__('os').path.basename(__file__)
# cp_08计算器案例.py
如上,两次执行,一次通过os模块获取当前目录,一次通过os模块获取当前文件名,那么再继续下去呢?
所以,不要滥用eval函数!
模块的介绍
模块时Python程序架构的一个核心概念;
模块就好比一个工具包,而里面的函数和变量就是工具;
模块的概念
所有以.py结尾的源文件都是一个模块,在文件中定义的[全局]变量和函数都能给外界使用,使用的前提是import导入模块
模块的演练
在一个文件创建两个函数和一个全局变量,在另一个文件导入第一个文件,.函数 即可调用函数, .变量 即可调用变量
定义函数:
hello_func.py
def hello():
print("hello world")
print("hello python")
name = "小明"
调用函数:
sayhello.py
import cp_01hello_func
hello_func.hello()
hello_func.name
注意:模块名也是标识符,需要遵循标识符的命名规则
如果在给py文件命名时以数字开头,在pycharm中无法调用这个模块,会报错;
pyc文件提高程序性能(了解即可)
当我们导入模块时,系统会检查是否有这个模块的编译缓存文件,如果没有则创建,有则不做事,因为对模块文件进行了预编译缓存,所以当我们调用时就不需要重新去模块中一行一行执行了,而是直接使用。
为什么会将模块预编译成二进制文件?因为模块时已经经过测试的代码,并且修改较少,所以可以进行预编译,就算偶尔进行了修改,程序也能帮我们进行检测重新编译新的二进制文件。
Python基础之函数和模块的更多相关文章
- python基础——filter函数
python基础——filter函数 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函 ...
- python基础——匿名函数
python基础——匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时 ...
- python基础——返回函数
python基础——返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_ ...
- python基础——sorted()函数
python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个d ...
- python基础——匿名函数及递归函数
python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...
- 八. Python基础(8)--函数
八. Python基础(8)--函数 1 ● 函数返回布尔值 注意, 自定义的函数也可以是用来作逻辑判断的, 例如内置的startswith()等函数. def check_len(x): ' ...
- Python:笔记(2)——函数与模块
Python:笔记(2)——函数与模块 Python函数 关于函数 1.我们可以使用Help来查看函数的帮助信息 2.调用函数的时候,如果传入的参数数量或者类型不符合均会报错. 3.函数名其实就是一个 ...
- python基础之函数详解
Python基础之函数详解 目录 Python基础之函数详解 一.函数的定义 二.函数的调用 三.函数返回值 四.函数的参数 4.1 位置参数 4.2 关键字参数 实参:位置实参和关键字参数的混合使用 ...
- Python基础(十)-模块
模块初识 一般把不同功能代码放到不同py文件,一个py文件就是一个模块 三种模块库: 1.Python标准库 2.第三方库 3.自定义库 导入模块:import 库名 (Python解释器只认识执行文 ...
随机推荐
- asp.net core 将配置文件配置迁移到数据库(一)
asp.net core 将配置文件配置迁移到数据库(一) Intro asp.net core 配置默认是项目根目录下的 appsettings.json 文件,还有环境变量以及 command l ...
- MongoDB 运维相关的命令
1.在线释放内存 use admindb.runCommand({closeAllDatabases:1}) 注:3.2 版本 已经去掉了这个命令了 2.rs.status() 查询复制集状态 3.d ...
- x宝23大洋包邮的老式大朝华MP3播放器简单评测
(纯兴趣测评,非广告) 最近逛X宝,看到了这个古董级MP3播放器居然还在售,于是脑抽+情怀泛滥买了一个. 然后呢,从遥远的深圳跨越好几千公里邮过来了这个玩意: 那节南孚5号电池是我自己的,是为了对比一 ...
- winform 实现类似于TrackBar的自定义滑动条,功能更全
功能很全,随便列几个 1.可以设置滑块的大小,边框颜色.背景色.形状等等吧 2.可以设置轨道的方向.边框颜色.背景色.阴影等等 ... 效果图: 下载链接https://download.csdn.n ...
- Hadoop系列005-Hadoop运行模式(下)
本人微信公众号,欢迎扫码关注! Hadoop运行模式(下) 2.3.完全分布式部署Hadoop 1)分析: 1)准备3台客户机(关闭防火墙.静态ip.主机名称) 2)安装jdk 3)配置环境变量 4) ...
- 前端笔记之JavaScript面向对象(四)组件化开发&轮播图|俄罗斯方块实战
一.组件化开发 1.1组件化概述 页面特效的制作,特别需要HTML.CSS有固定的布局,所以说现在越来越流行组件开发的模式,就是用JS写一个类,当你实例化这个类的时候,页面上的效果布局也能自动完成. ...
- 小议 localStorage
前言 什么是 localStorage? 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条co ...
- Vue2.0源码阅读笔记(二):响应式原理
Vue是数据驱动的框架,在修改数据时,视图会进行更新.数据响应式系统使得状态管理变的简单直接,在开发过程中减少与DOM元素的接触.而深入学习其中的原理十分有必要,能够回避一些常见的问题,使开发变的 ...
- Abp中使用可视化的日志面板
Abp中使用可视化的日志面板 如果你还不了解LogDashboard请看这里. ABP的相关知识不做介绍如果有需要请阅读ABP官方文档 ABP是Net下非常优秀的开发框架,在中国很多的项目都正在使用它 ...
- 基于 DataLakeAnalytics 做跨地域的数据分析
在阿里云上,很多客户的应用都是多地域部署的, 比如在北京(cn-beijing)的地域部署一个应用让北方的客户访问快一点,同时在杭州(cn-hangzhou)地域部署一份让南方的客户访问快一点.多地域 ...