python — 函数基础知识(一)
程序员文章站
2022-06-20 23:03:02
[TOC] 1 面向过程编程与函数式编程 截至目前我们所接触、所写的编程为:面向过程式编程【可读性差/可重用性差】 对于函数编程: 本质:将N行代码拿到别处并给他起个名字,以后通过名字就可以找到这段代码并执行。 场景: 代码重复执行 代码特别多超过一屏,可以选择通过函数进行代码的分割 2 函数的基本 ......
目录
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]
-
-
调用函数
位置参数在前,关键字参数在后。
上一篇: C笔记_常用快捷键
下一篇: Django之ORM-model模型属性