python — 函数基础知识(一)
1 面向过程编程与函数式编程
截至目前我们所接触、所写的编程为:面向过程式编程【可读性差/可重用性差】
# 面向过程编程
user_input = input('请输入角色:')
if user_input == '管理员':
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
msg = MIMEText('管理员,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')
msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])
msg['To'] = formataddr(["管理员", '344522251@qq.com'])
msg['Subject'] = "情爱的导演"
server = smtplib.SMTP("smtp.163.com", 25)
server.login("15776556369@163.com", "qq1105400511")
server.sendmail('15776556369@163.com', ['管理员', ], msg.as_string())
server.quit()
elif user_input == '业务员':
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
msg = MIMEText('业务员,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')
msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])
msg['To'] = formataddr(["业务员", '业务员'])
msg['Subject'] = "情爱的导演"
server = smtplib.SMTP("smtp.163.com", 25)
server.login("15776556369@163.com", "qq1105400511")
server.sendmail('15776556369@163.com', ['业务员', ], msg.as_string())
server.quit()
elif user_input == '老板':
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
msg = MIMEText('老板,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')
msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])
msg['To'] = formataddr(["老板", '老板邮箱'])
msg['Subject'] = "情爱的导演"
server = smtplib.SMTP("smtp.163.com", 25)
server.login("15776556369@163.com", "qq1105400511")
server.sendmail('15776556369@163.com', ['老板邮箱', ], msg.as_string())
server.quit()
# 函数式编程
def send_email():
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
msg = MIMEText('老板,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')
msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])
msg['To'] = formataddr(["老板", '老板邮箱'])
msg['Subject'] = "情爱的导演"
server = smtplib.SMTP("smtp.163.com", 25)
server.login("15776556369@163.com", "qq1105400511")
server.sendmail('15776556369@163.com', ['老板邮箱', ], msg.as_string())
server.quit()
user_input = input('请输入角色:')
if user_input == '管理员':
send_email()
elif user_input == '业务员':
send_email()
elif user_input == '老板':
send_email()
对于函数编程:
- 本质:将N行代码拿到别处并给他起个名字,以后通过名字就可以找到这段代码并执行。
- 场景:
- 代码重复执行
- 代码特别多超过一屏,可以选择通过函数进行代码的分割
2 函数的基本结构
# 函数的定义
def 函数名(): # 函数名的命名规范、建议与变量的一样
# 函数内容 (缩进)
pass
# 函数的执行
函数名()
def get_list_first_data():
v = [11,22,33,44]
print(v[0])
get_list_first_data()
# 注意:函数如果不被调用,则内部代码永远不会被执行。
# 假如:管理员/业务员/老板用的是同一个邮箱。
def send_email():
print('发送邮件成功,假设有10含代码')
user_input = input('请输入角色:')
if user_input == '管理员':
send_email()
elif user_input == '业务员':
send_email()
elif user_input == '老板':
send_email()
总结:
# 情况1
def f1():
pass
f1()
# 情况2
def f2(a1):
pass
f2(123)
# 情况3
def f3():
return 1
v1 = f3()
# 情况4
def f4(a1,a2):
# ...
return 999
v2 = f4(1,7)
def show(name,age):
"""
函数是干什么的... # 必须注明函数
:param name:
:param age:
:return:
"""
return None
函数内部的数据是否会混乱:(函数与函数之间的执行互不影响)
- 1.函数执行完毕
- 2.内部元素不被其他人使用 ---->销毁函数执行的内存数
3 函数的参数
def get_list_first_data(aaa): # aaa叫形式参数(形参)
v = [11,22,33,44]
print(v[aaa])
get_list_first_data(1) # 2/2/1调用函数时传递叫:实际参数(实参)
get_list_first_data(2)
get_list_first_data(3)
get_list_first_data(0)
严格按照顺序传参数:位置方式传参
实际参数可以是任意类型
# 假如:管理员/业务员/老板用的是同一个邮箱。
"""
def send_email(to):
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
msg = MIMEText('导演,我想演男一号,你想怎么着都行。', 'plain', 'utf-8')
msg['From'] = formataddr(["李邵奇", '15776556369@163.com'])
msg['To'] = formataddr(["导演", to])
msg['Subject'] = "情爱的导演"
server = smtplib.SMTP("smtp.163.com", 25)
server.login("15776556369@163.com", "qq1105400511")
server.sendmail('15776556369@163.com', [to, ], msg.as_string())
server.quit()
"""
def send_email(to):
template = "要给%s发送邮件" %(to,)
print(template)
user_input = input('请输入角色:')
if user_input == '管理员':
send_email('xxxx@qq.com')
elif user_input == '业务员':
send_email('xxxxo@qq.com')
elif user_input == '老板':
send_email('xoxox@qq.com')
练习题
# 1. 请写一个函数,函数计算列表 info = [11,22,33,44,55] 中所有元素的和。
def get_sum():
info = [11,22,33,44,55]
data = 0
for item in info:
data += item
print(data)
get_sum()
# 2. 请写一个函数,函数计算列表中所有元素的和。
def get_list_sum(a1):
data = 0
for item in a1:
data += item
print(data)
get_list_sum([11,22,33])
get_list_sum([99,77,66])
v1 = [8712,123,123]
get_list_sum(v1)
# 3. 请写一个函数,函数将两个列表拼接起来。
def join_list(a1,a2):
result = []
result.extend(a1)
result.extend(a2)
print(result)
join_list([11,22,33],[55,66,77]
# 4. 计算一个列表的长度
def my_len(arg):
count = 0
for item in arg:
count += 1
print(count)
v = [11,22,33]
my_len(v)
len(v)
# 5. 发邮件的示例
def send_email(role,to):
template = "要给%s%s发送邮件" %(role,to,)
print(template)
user_input = input('请输入角色:')
if user_input == '管理员':
send_email('管理员','xxxx@qq.com')
elif user_input == '业务员':
send_email('业务员','xxxxo@qq.com')
elif user_input == '老板':
send_email('老板','xoxox@qq.com')
3.1 形参
3.1.1 基本参数知识
参数可以是任意个数
可以是任意类型
def func(a1,a2,a3,a4):
print(a1,a2,a3,a4) func(2,'name',[1,2,3],False)
3.1.2默认参数
def func(a1,a2,a3=9,a4=10): # 默认参数a3=9,a4=10
print(a1,a2,a3,a4)
func(11,22) # 不给a3,a4传值,则a3,a4等于默认参数
func(11,22,10)
func(11,22,10,100)
func(11,22,10,a4=100)
func(11,22,a3=10,a4=100)
func(11,a2=22,a3=10,a4=100)
func(a1=11,a2=22,a3=10,a4=100)
3.1.3 万能参数(用于打散)
*args
可以接受任意个数的位置参数,并将参数转换成元组。
1.调用函数无*
def func(*args):
print(*args) func(1,2) ==> (1,2)
func(1,2,[12,3,4]) ==> (1,2,[12,3,4])
func((11,22,33)) ==> ((11,22,33)) # 参数是一个元组,打印出来的效果是元组套元组。
2.调用函数有*
def func(*args):
print(args) func(*(11,22,33)) ==>(11,22,33) # *是用来打散元组的,将元组中的每个元素作为参数。
func(*[11,22,33]) ==>(11,22,33) # *可以用来打散列表/元组 /字典/集合,只是循环内部元素
3.只能用位置传参
def func(*args):
print(args) func(1)
func(1,2) # args=(1, 2)
func((11,22,33,44,55)) # args=((11,22,33,44,55),)
func(*(11,22,33,44,55)) # args=(11,22,33,44,55)
**kwargs
可以接受任意个数的关键字参数,并见参数转换成字典
1.调用函数无*
def func(**kwargs):
print(***kwargs) func(k=1) **kwargs = {'k':1}
func(k1=1,k2=3) **kwargs = {'k1':1,'k2':3}
2.调用函数有*
def func(**kwargs):
print(kwargs) func(**{'k1':1,'k2':4,'k3':9}) **kwargs = {'k1':1,'k2':4,'k3':9}
3.只能用关键字传参
*args/**kwargs综合使用:无敌 + 无敌 => 真无敌
def func(*args,**kwargs):
print(args,kwargs) func(1,2,3,4,5,k1=2,k5=9,k19=999) *arg = (1,2,3,4,5) **kwargs = {'k1':2,'k5':9,'k19':999}
func(*[1,2,3],k1=2,k5=9,k19=999) *arg = (1,2,3) **kwargs = {'k1':2,'k5':9,'k19':999}
func(*[1,2,3],**{'k1':1,'k2':3}) *arg = (1,2,3) **kwargs = {'k1':1,'k2':3}
func(111,222,*[1,2,3],k11='alex',**{'k1':1,'k2':3})
*arg = (111,222,1,2,3) **kwargs = {'k11':'alex','k1':1,'k2':3}
3.2 实参
3.2.1 位置传参(调用函数并传入参数)(执行)
调用/执行函数的时候严格按照位置的顺序传入参数
def func(a1,a2,a3):
print(a1,a2,a3)
func(66,'alex',3)
3.2.2 关键字传参(执行)
关键字传参就是将形参放入到实参中去使用
def func(a1,a2):
print(a1,a2)
func(a1=22,a2=8)
关键字传参与位置传参是可以混合使用的:位置传入的参数要放在前面,关键字传参要放在后面,最后等于总参数个数
def func(a1,a2,a3):
print(a1,a2,a3)
func(1,2,a3=3)
func(1,a2=2,a3=3)
func(a1=1,a2=2,a3=3)
func(a1=1,2,3) # 是错误的
def func() : 自定义函数 open() 这两个为python的内置函数
pass len()
3.3 参数相关的重点
定义函数
def func(a1,a2):
pass def func(a1,a2=None): # 对于默认值,不可变类型随便写,如果是可变类型(有坑)。
pass def func(*args,**kwargs):
pass
对于函数的默认值一般使用不可变类型,慎用可变类型:
如果要想给value设置默认值是空列表:
# 不推荐使用(会有坑):
def func(data,value = [])
pass 推荐使用:
def func(data ,value = None)
if not value:
value = []
# 示例:
def func(data,value = []
value.append(data)
return value v1 = func(1) # v1 = [1]
v2 = func(2,[11,22,33]) # v2 = [11,22,33,2]
v3 = func(3) # v3 = [1,3]
练习题:
def func(a,b=[]) 有什么陷阱?
如果不给b传参数,则默认的都是同一个地址
看代码写结果
def func(a,b=[]):
b.append(a)
return b l1 = func(1)
l2 = func(2,[11,22])
l3 = func(3) print(l1,l2,l3) # [1,3] [11,22,2] [1,3]
看代码写结果
def func(a,b=[]):
b.append(a)
print(b) func(1) # [1]
func(2,[11,22,33]) # [11,22,33,2]
func(3) # [1,3]
调用函数
位置参数在前,关键字参数在后。
python — 函数基础知识(一)的更多相关文章
- 10分钟学会Python函数基础知识
看完本文大概需要8分钟,看完后,仔细看下代码,认真回一下,函数基本知识就OK了.最好还是把代码敲一下. 一.函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运 ...
- python 函数基础知识整理
一.函数的定义: 定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":". def 是固定的,不能变,必须是连续的def三个字母,不能分开... 空格 为了将 ...
- python — 函数基础知识(二)
目录 1 返回值 2 作用域 3 函数小高级 4 函数中高级 1 返回值 def func(arg): # .... return 9 # 返回值为9 默认:return None val = fun ...
- python函数-基础知识
一.含义函数是程序内的“小程序” 二.示例 #!/usr/bin/env python #coding:utf-8 def hello(): print('Hello world!') print(' ...
- python 函数基础知识
1.函数返回的多个值会被组织成元组被返回,也可以用多个值来接收 2.调用函数时候,传入的参数叫实际参数,简称实参,定义函数的参数叫做形式参数,简称形参-- 位置参数 def mymax(x,y): a ...
- 《转》Python学习(17)-python函数基础部分
http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...
- Python数据挖掘——基础知识
Python数据挖掘——基础知识 数据挖掘又称从数据中 挖掘知识.知识提取.数据/模式分析 即为:从数据中发现知识的过程 1.数据清理 (消除噪声,删除不一致数据) 2.数据集成 (多种数据源 组合在 ...
- Python 面向对象基础知识
面向对象基础知识 1.什么是面向对象编程? - 以前使用函数 - 类 + 对象 2.什么是类什么是对象,又有什么关系? class 类: def 函数1(): pass def 函数2(): pass ...
- Python:基础知识
python是一种解释型.面向对象的.带有动态语义的高级程序语言. 一.下载安装 官网下载地址:https://www.python.org/downloads 下载后执行安装文件,按照默认安装顺序安 ...
随机推荐
- JDK8 新特性 Lambda表达式
1.java8中Lambda表达式基础语法: (x,y) -> {} 左侧是一个小括号,里面是要实现的抽象方法的参数,有几个参数就写几个参数名,无参可写空括号,无需声明参数类型: 中间是一个jd ...
- elasticsearch 内部对象结构数据索引
内部对象 经常用于 嵌入一个实体或对象到其它对象中.例如,与其在 tweet 文档中包含 user_name 和 user_id 域,我们也可以这样写: { "tweet": &q ...
- 【原创】CancellableWait
应用程序不能正常退出,导致无法关机,这种情况通常是应用程序在等待一些I/O request to finish. 应用程序访问远程文件时,这种情况的发生更加频繁. If an application ...
- Java并发指南9:AQS共享模式与并发工具类的实现
一行一行源码分析清楚 AbstractQueuedSynchronizer (三) 转自:https://javadoop.com/post/AbstractQueuedSynchronizer-3 ...
- sql注入笔记-mysql
整理下sql相关知识,查漏补缺(长期更新) 1 常用语句及知识 information_schema包含了大量有用的信息,例如下图 mysql.user下有所有的用户信息,其中authenticati ...
- NodeJS的exports、module.exports与ES6的export、export default深入详解
前言 决定开始重新规范的学习一下node编程.但是引入模块我看到用 require的方式,再联想到咱们的ES6各种export .export default. 阿西吧,头都大了.... 头大完了,那 ...
- mysql 远程登陆
1.查询mysql是否启动 netstat -lnp|grep 3306 ps -df |grep mysqld 2.通过TCPIP的方式测试连接 mysql -uqingjiao -padm ...
- python3 django项目从项目中导出依赖包
1. 在项目的根目录中使用mac终端执行命令, pip3 freeze > requirements.txt #requirements.txt只是个名字可以随便起,一般默认为requireme ...
- 在Win7下玩PC游戏发生类似d3d9x_43.dll找不到的情况
由于d3d9x属于DirectX9.0c扩展,默认不会随系统安装.因此要快速修复这个问题可以去微软官网下载D3D驱动补丁. http://www.microsoft.com/zh-cn/downloa ...
- python select模块
Python select 一.前言 Python的select()方法直接调用操作系统的IO接口,它监控sockets,open files, and pipes(所有带fileno()方法的文件句 ...