day09-10

5.1 发送邮件

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

msg = MIMEText('正文内容', 'plain', 'utf-8')
msg['From'] = formataddr(["发件人", '发件地址'])
msg['To'] = formataddr(["收件人", '收件地址'])
msg['Subject'] = "主题"

server = smtplib.SMTP("发件方服务器", 25)
server.login("发件邮箱", "密码")
server.sendmail('发件邮箱', ['收件邮箱', ], msg.as_string())
server.quit()

5.2 函数的基本结构

··· 本质:将N行代码拿到别处并给他起个名字,以后通过名字就可以找到这段代码并执行。

··· 场景:

  • 代码重复执行。

  • 代码量特别多超过一屏,可以选择通过函数进行代码的分割。

    # 函数的定义
    def 函数名():
       # 函数内容
       pass

    # 函数的执行
    函数名()

     

def func():
   pass

func() # 注意:函数如果不被调用,则内部代码永远不会被执行。

5.3 函数的参数

··· 函数的参数 优先位置参数,再关键字参数,实际参数可以是任意类型。

··· 任意类型 任意个数

# 位置传参

def func(a,b): # a为形式参数
   pass

func(c,d) # b为实际参数

# 关键字传参

def func(a1, a2):
   print(a1, a2)

func(a2=99,a1=2)

# 关键字传参数和位置传参可以混合使用(位置传入的参数 > 关键字参数在后 = 总参数个数)
def func1(a1, a2, a3):
   print(a1, a2, a3)

# func(1, 2, a3=9)
# func(1, a2=2, a3=9)
# func(a1=1, a2=2, a3=9)
# func(a1=1, 2,3) # 错误

# 默认参数

def func(a1,a2,a3=9,a4=10):
   print(a1,a2,a3,a4)

func(11,22)
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)
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')
万能参数(打散)

*args

可以接受任意个数的位置参数,并将参数转换成元组。

调用函数无 *

def func(*args):
   print(args)

func(1,2,3,4)
调用函数有 *

def func(*args):
   print(args)

func(*(1,2,3,4))
func(*[1,2,3,4])
只能用位置传参

def func(*args):
   print(args)

# func(1)
# func(1,2)
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

可以接受任意个数的关键字参数,并将参数转换成字典。

调用函数无 **


def func(**kwargs):
   print(kwargs)


func(k1=1,k2="alex")
调用函数有**

def func(**kwargs):
   print(kwargs)
func(**{'k1':'v2','k2':'v2'}) # kwargs={'k1':'v2','k2':'v2'}
只能用关键字传参

综合应用:无敌 + 无敌 => 真无敌

def func(*args,**kwargs):
   print(args,kwargs)

# func(1,2,3,4,5,k1=2,k5=9,k19=999)
func(*[1,2,3],k1=2,k5=9,k19=999)
func(*[1,2,3],**{'k1':1,'k2':3})
func(111,222,*[1,2,3],k11='alex',**{'k1':1,'k2':3})


# def func(a1,*args,a2):   # args 代指所有位置参数 *args 可以代表一个整体的元组作为参数
#     print(a1,args,a2)
# func(1,2,3,1,3,a2=5)


# def func(a1,*args,a2=9):
#     print(a1,args,a2)
# func(1,2,3,1,3)





# def func(**kwargs):   # kwargs 代表所有的关键字参数 **kwargs 可以代表一个整体的字典作为参数
#     print(kwargs)
# func(**{'k1':'v2','k2':'v2'}) # kwargs={'k1':'v2','k2':'v2'}
#
# func(k1=1,k2="alex") # kwargs={'k1': 1, 'k2': 'alex'}
# func(k1={'k1':99,'k2':777},k2="alex") # kwargs={'k1': {'k1': 99, 'k2': 777}, 'k2': 'alex'}
# func(**{'k1':'v2','k2':'v2'}) # kwargs={'k1':'v2','k2':'v2'}

 

5.4 函数的返回值

··· 函数没有返回值,默认返回:None

··· 函数内部执行过程中遇到return,就终止。

def func():
   return xxx

v=func()  # v 即为 返回值 需要变量接收
def func1():
   return "完成" # 函数每次执行到此,就返回;所以下面代码永远不执行。
   for i in range(10):
       print(i)
func1()


def func2():
   for i in range(10):
       print(i)
       return "完成"
   print(666)
func2()
def func():
   return (1,2,3)

v = func()
print(v)

# 特殊:返回元组
def func():
   return 5,8,"alex"

v = func()
print(v)

5.5 函数的作用域

python中:

  • py文件:全局作用域

  • 函数:局部作用域

    a = 1
    def s1():
      x1 = 666
      print(x1)
      print(a)
      print(b)

    b = 2
    print(a)
    s1()
    a = 88888
    def s2():
      print(a,b)
      s1()

    s2()
  • 总结:

    • 一个函数是一个作用域

      def func():
        x = 9
        print(x)
      func()
      print(x)
    • 作用域中查找数据规则:优先在自己的作用域找数据,自己没有就去 "父级" -> "父级" -> 直到全局,全部么有就报错。注意:父级作用域中的值到底是什么?

      x = 10
      def func():
         x = 9
         print(x)

      func()

      子作用域中只能 找到父级中的值 ,默认无法重新为父级的变量进行赋值。(global/nonlocal可以强制做)

      # #####################
      name = 'oldboy'
      def func():
        name = 'alex' # 在自己作用域再创建一个这样的值。
        print(name)
      func()
      print(name)



      # #####################
      name = [1,2,43]
      def func():
        name.append(999)
        print(name)
      func()
      print(name)

      # ###################### 如果非要对全局的变量进行赋值
      # 示例一
      name = ["老男孩",'alex']
      def func():
        global name
        name = '我'
      func()
      print(name)
      # 示例一
      name = "老男孩"
      def func():
        name = 'alex'
        def inner():
            global name
            name = 999
        inner()
        print(name)
      func()
      print(name)


      name = "老男孩"
      def func():
        name = 'alex'
        def inner():
            global name
            name = 999
        inner()
        print(name)
      func()
      print(name)

      # ############################## nonlocal
      name = "老男孩"
      def func():
        name = 'alex'
        def inner():
            nonlocal name # 找到上一级的name
            name = 999
        inner()
        print(name)
      func()
      print(name)
    •  

posted @ 2020-05-05 00:04  投降输一半!  阅读(164)  评论(0编辑  收藏  举报