python-day07-函数基础

1.初始函数

面向过程编程,从上到下按照业务逻辑之一实现

#定义函数
def 函数名():
 代码
 代码
 代码
 
 #调用函数
 函数名()
 函数名()
def get_info():
  print("欢迎使用xx系统")
  v1=1
  v2=2
  v3=v1+v2
  print(v3)
  
get_info()

函数式编程:公共重复的功能提取到函数中

反复利用某段代码【增强代码的重用性】

特别长的逻辑,拆分到函数中【增强代码的可读性】

def 发送邮件():
   发送邮件报警-10行
   ...
if cpu使用率>90%:
   发送邮件()
   
 if 内存>90%:
   发送邮件()
   
 if 硬盘>90%:
    发送邮件()
   

2.函数的参数

注意:任意类型都可以作为参数传递

*位置传参

def send_email(x1):
    print(x1)
send_email(a)
def send_email(x1,x2,x3):
    print(x1)
send_email(a,b,c)

*关键字传参

send_email(x1=11,x2=22,x3=33)

*混合传参(关键字传参放在后面)

send_email(11,x2=22,x3=33)

*默认值

def send_email(x1,x2,x3=999):
  pass
send_email(11,x2=22)        #x3=999
send_email(11,x2=22,x3=888) #x3=888

8

3.练习题

定义函数,接收1个字符串类型的参数,在函数内部计算字符串中"a"出现的次数,输出
def count():
  x=0
  str=input("请输入字符串:")
  for i in range(len(str)):
    if str[i]=="a":
       x=x+1
  print(x)
count()
    
    
def get_str_count(data_string):
  count=0
  for i in data_string:
     if str[i]=="a":
        count=count+1
  print(count)
get_str_count("shuahdusadjiojiajdmka")


#定义函数,接收2个字符串类型的参数,在函数内部计算字符串中第二个参数默认a出现的次数,输出
def get_str_count(data_string,key="a"):
  count=0
  for i in data_string:
     if str[i]=="a":
        count=count+1
  massage="{}出现的次数:{}".format(key,count)
  print(massage)
get_str_count("shuahdusadjiojiajdmka")
get_str_count("shuahdusadjiojiajdmka","b")
  

4.动态参数

def send_email(x1,x2,x3=999):  #x3是默认参数
  pass
  
send_email(11,x2=22)    

函数的默认参数中出现了可变类型一定要谨慎(list/dict)

def func(a2=[]):
  a2.append(2)
  print(a2)
 func()     #[2]
 func([])   #[2]      func([1,]) [1,2]
 func()     #[2,2]
 
 注意:执行函数未传递参数,默认每次创建一个空列表赋值给a2——>错误

*

def func(*a1)  
#a1=(1,11,33)
#a1=("xx",123)
#a1=([11,22,3],"张三")
#a1=(1,)
#a1=()
#a1=([11,22,3],)
#a1=((11,22,3),)

  pass

func(1,11,33)
func("xx",123)
func([11,22,3],"张三")
func(1)
func()
func([11,22,3])
func((11,22,3))

**

def func(**a1)  
#a1={"v1":"1","v2":"11"}
#a1={}
#a1={"uu":"999"}

  pass
  
func(v1=1,v2=11)
func()
func(uu=999)

*,**

def func(*a1,**a2)  
#a1=(1,2)    a2={}
#a1=()       a2={"v1":"1","v2":"11"}
#a1=(99,)    a2={"data":"123"}
  pass
  
 func(1,2)
 func(v1=1,v2=11)
 func(99,data=123)




def func(n1,n2,*a1,*a2):
#n1=1,n2=2,a1=(123,),a2={"v1":123}
#
  pass
  
func(1,2)
func(1,2,123,123,v1=123)  
易错点

def f1(arg):
    pass
f1(123)
f1("xxx")
f1([11,22,33])

def f2(*args,**kwargs):
   pass
 #args=([11,22,33])
 #args=((11,22,33))
 #kwargs={"v1":(11,22,33)}
f2([11,22,33])
f2((11,22,33))
f2(v1=(11,22,33))

5.函数的返回值

返回值,执行函数之后的结果

def add(v1,v2)
  return v1+v2
res=add(10,20)

return :在函数中作于返回值

print:输出

返回值可以是任意类型
def func():
  return 123
  
  def func():
  return "xxx"
  
  def func():
  return [11,22,33]
  
  函数没有返回值,默认返回None
  def func():
    data=123
  res=func()   #res=None
  
  函数内部一旦遇到return函数立即终止
  

练习题

定义函数,接收任意个位置传参的参数(整数类型),在函数的内部将用户传入的所有参数相加并得到最后的结果,将结果返回给调用者

def func(*args):
  result = 0
  for item in args:
      result = result + item
  return result
v1=func(11,22,33)
def func(*args):
  result = 0
  for item in args:
     if type(item)==str:
        if item.isdecimal():
           result=result+int(item)
     else:
         result = result + item
  return result
v1=func(11,22,33)

写函数,接受2个参数:文件路径、文本——>读取文件每行内容,判断这一行是否包含第二个参数指定的文本,如果包含,则将文件的那一行并添加到列表中,返回列表
import os
#
def func(path,key):
  #读文件保证文件存在
  f = open("path", mode='rb', encoding='utf-8')
  data_list = []

  #判断文件是否存在
  if not os.path.exists(path):
      return data_list

  for line in f:
    line = line.strip()
    if not line:
      continue
    if key in line:
      data_list = data_list.append(line)
    print(data_list)
  f.close()
  return data_list
func()
      

6.扩展

def func()
 return11,22,33
 
v1=func()
print(v1)  #(11,22,33)
def func()
 return11,22,33
 
v1,v2,v3=func()
print(v1,v2,v3)

7.调用函数

def f1():
  print(11)
  print(22)
  
def f2():
  print(99)
  f1()
  print(66)
 
f2()

注意:函数传递是引用,不会重新拷贝一份数据,再传入其中
def f1(a1):
   a1.upper()  #字符串是不可变类型,生成新的字符串需要重新赋值
               #列表是可变类型
v1="root"
f1(v1)
print(v1)    #v1=root

8.python中的作用域

作用域:一块共享区域,区域里面的资源共享

python中有一个全局作用域

在python中一个函数是一个作用域

name="张三"
age=18
if 1==1:
  size=10
for i in range(10):
   pass
print(name,age,size,i)    #i=9
name="张三"
age=18

def func():
  v1=10
  v2"root"
  print(v1)
  print(name)  #可以向上找数值"孩子可以找爸爸"
func()


9.全局和局部变量

#全局变量 大写
NAME="张三"
AGE=18

def func():
 #局部变量 小写
  v1=10
  v2"root"
  print(v1)
  print(name)  #可以向上找数值"孩子可以找爸爸"
func()

10.global关键字

name="lisa"
def f():
  global name   #后续操作的name都是全局
  name ="root"  #将name改成root
  print(name)   #root
f()
print(name)     #root

11.函数名也是一个变量名称

def f1()
  print("123")
f2=f1    #f1赋给f2
f2()
def f1()
  print("123")
data_list=[11,"lisa",True,f1(),f1]
data_list[-1]()    #执行函数
data_list[-2]      #f1()的执行结果,None
应用场景
def send_sms():
  print("发短信提醒:")
def send_email():
  print("发邮件提醒:")
def send_wechat():
  print("发短信提醒:")
func_list=[send_sms,send_email,send_wechat]
for func in func_list:
    func()
#定义三个函数分别为注册,登录,查看用户信息
#输出1注册  2登录  3查看信息
#选择序号,根据序号不同选择不同的函数

def register():
   print("注册")

def login():
  print("登录")

def user_info():
  print("用户信息")

dict = {
  "1": register,
  "2": login,
  "3": user_info
}

print("欢迎登陆")
print("1.注册  2.登录  3.查看用户信息")
choice = input("请选择")
func = dict.get(choice)
if func:    #如果choice选择不存在,choice=None,即F
  func()
else:
  print("选择错误")
dict = {
  "1":( register,"注册")
  "2": (login,"登录")
  "3": (user_info,"查看信息")
}
lin_list=[]
for k,v in dict.items():
  line="{}.{}".format(k,v[-1])
  lin_list.append(line)
masssge=" ".join(line_list)
print(massage)

12.匿名函数(lambda表达式)

如果函数只当参数使用,后期不再使用,建议使用匿名函数

def func(x,y):
  return x+y

func=lambda x,y:100+y   #默认包含return,即return100+y

func=lambda x,y:100+y
res=func(1,2)
print(res)    #102

func=lambda x,y:x+y
res=func(1,2)
print(res)    #3

func=lambda *args,**kwargs:len(args)+len(kwargs)
res=func(11,22,v1=1)
print(res)   #3

基于python代码发邮件

#将pyth内置的模块(功能导入)
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

#构建邮件内容
msg=MIMEText("周二快乐~","html","utf-8")                                    #内容
msg['From']=formataddr(["高宇彤","m18241634100@163.com"])    #自己的名字/自己的邮箱
msg['to']='451078950@qq.com'   #目标邮箱
msg['Subject']="祝福"        #主题

#发送邮件
sever=smtplib.SMTP_SSL("smtp.163.com")
sever.login("m18241634100@163.com","CTTEURHZEZSHKWEI")     #账户/授权码
sever.sendmail("m18241634100@163.com","451078950@qq.com",msg.as_string())  #自己邮箱/目标邮箱/内容
sever.quit()
def send_email(to,subject,content):

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

#构建邮件内容
msg=MIMEText(content,"html","utf-8")                                    #内容
msg['From']=formataddr(["高宇彤","m18241634100@163.com"])    #自己的名字/自己的邮箱
msg['to']=to   #目标邮箱
msg['Subject']=subject"       #主题

#发送邮件
sever=smtplib.SMTP_SSL("smtp.163.com")
sever.login("m18241634100@163.com","CTTEURHZEZSHKWEI")     #账户/授权码
sever.sendmail("m18241634100@163.com",to,msg.as_string())  #自己邮箱/目标邮箱/内容
sever.quit()

email=input("请输入邮箱")
body=input("请输入内容")
send_email(email,"测试邮件",body)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值