函数

函数(方法,功能)

函数的作用提高代码的复用性,让代码更简介

简单定义一个函数  使用def

def sayhello():  # 函数名
    print('hello')  #函数体
#函数不调用是不会被执行的
sayhello()   #调用函数

函数的参数

1.形参和实参

def calc(a,b):  #a,b 叫做形参,形式参数
    res = a * b
    print('%s * %s =%s'%(a,b,res))
calc(7,8)    #7,8 叫做实参  实际参数
用return的写法
def calc(a,b):
    return a * b
print(calc(7,8))

 

 2.位置参数  

按照参数的位置来传参,calc这个函数中,a和b就是位置参数,是必传的,没有会报错 

def calc(a,b): #位置参数,必填,不填会报错missing 2 required positional arguments
    print('%s * %s = %s'%(a,b,a*b))
calc(7,8) 

3.默认值参数

默认值参数是非必填的,如果填了参数,取的是填的参数,没填去的是None   如果使用默认值参数的话,必须放在位置参数后面定义。

def op_file(file_name,conent=None): #  conent默认值参数,非必填参数
    #默认值参数
    f = open(file_name,'a+',encoding='utf-8')
    f.seek(0)
    if conent:    #不为空代表写
        f.write(conent)
        f.flush()
    else:                    #为空代表读
        all_users = f.read()
        return all_users  #调用完函数之后,返回什么结果
    f.close()
res = op_file('a.txt','hh')     #hh 就是自己填的参数
print(res)

 3 不固定参数

  参数组用*接收

可以传多个参数,参数非必填的,返回的是一个元祖

def syz(*args):   #参数组    *args
    print(args)
syz()
syz('niuhanyang','123',123)
syz('ls','sdf')

关键字参数

关键字参数使用**来接收

可以传多个参数,参数非必填的,返回的是一个字典

def syz2(**kwargs):   #关键字参数
    print(kwargs)
syz2()
syz2(name='lily',age='23')      #{'name':'lily','age':'23'}
syz2(name='lily',age='23',addr='china')
syz2('lily')      #报错  

 

 函数的返回值  return

每个函数都有返回值,如果没有在函数里面指定返回值的话,在python里面函数执行完之后,默认会返回一个None,函数也可以有多个返回值,如果有多个返回值的话,会把返回值都放到一个元组中,返回的是一个元组

 

def calc(x, y):  # 这个就是定义了一个有返回值的函数
    c = x * y
    return c, x, y
res = calc(5, 6)  # 把函数的返回结果赋值给res   
print(res)   #(30,5,6)

 

 返回值作用:

  1、把函数处理的结果返回回来,供后面的程序用。

  2、结束函数,函数里面遇到return,函数会立即结束

def op_file(file_name,conent=None):
                      #默认值参数
    f = open(file_name,'a+',encoding='utf-8')
    f.seek(0)
    if conent:  #不为空代表写
        f.write(conent)
        f.flush()
    else:
        all_users = f.read()
        return all_users  #调用完函数之后,返回什么结果
    f.close()
#res = op_file('a.txt')      #默认值参数为空,就是读   #xiaomeng
res = op_file('a.txt','龚丽娜')    #默认值参数不为空,就是写   返回None
                         #默认值参数
print(res)

 

函数遇到return  立即结束

def hh():
    for i in range(5):
        print(i)
        if i ==3:
            return
hh()         # 0  1   2  3
import string
def check(pwd):
    #密码规则  长度6-11位 包含字母和数字
    if len(pwd)>5 and len(pwd)<12:
        if set(pwd) &set(string.ascii_letters)and set(pwd)&set(string.digits):
            print('密码合法')
        else:
            print('密码不合法')
    else:
        print('密码不合法')
res = check('asds34')   #密码合法    
#函数里面没有return的话,默认返回None,return 不是必须写的
print(res) # None

局部变量和全局变量

常量:

一个不变的值,通常用大写字母定义

PORT = 3306 #常量
FLIENAME = 'user.txt'

 

局部变量:

函数里面定义的变量,都是局部变量,只要出了函数就不能用了

name = '小萌'   #全局变量   
def sayName():
    name = '小伟'   #局部变量  
    print('name1',name)    #name1  小伟
sayName()
print('name2',name)  # name2  小萌

全局变量:

全局变量的意思就是在整个程序里面都生效的,在程序最前面定义的都是全局变量,全局变量如果要在函数中修改的话,需要加global关键字声明,如果是list、字典和集合的话,则不需要加global关键字,直接就可以修改。

name = '小萌'   #全局变量   如果要改全局变量的话,先声明一下,你修改值是全局变量
def sayName():
    global name    #global 修改
    name = '小伟'
    print('name1',name)   #name1 小伟
sayName()
print('name2',name)    #name2  小伟

最好少用全局变量的原因:

  (1) 不安全,因为所有人都可以改
  (2) 全局变量它会一直占着内存

 递归

递归 函数自己调用自己 递归效率不高,少用递归,递归最多999次

 

def test1():
    num = int(input('please enter a number:'))
    if num%2==0:#判断输入的数字是不是偶数
       return True #如果是偶数的话,程序就退出了,返回true
    print('不是偶数请重新输入!')
    return test1()#如果不是偶数的话继续调用自己,输入值
print(test1())#调用test

 

函数返回多个值,2中写法

1.函数如果返回多个值的话,他会把这几个值放在一个元祖里面
2.函数如果返回多个值的话,也可以用多个变量来接收
#1.函数如果返回多个值的话,他会把这几个值放在一个元祖里面
def say():
    num1 = 1
    num2 = 2
    num3 = 3
    return num1, num2, num3
res = say()
print(res)   #(1,2,3)
#2.函数如果返回多个值的话,也可以用多个变量来接收
def say():
    num1 = 1
    num2 = 2
    num3 = 3
    return num1, num2, num3
res1,res2,res3 = say()
print(res1)  #1
print(res2)  #2
print(res3)  #3

 

匿名函数

lamdba定义匿名函数,匿名函数,这个功能很简单,只用1次

res = lambda x:x+1  #冒号后面是函数体,也就是函数的处理逻辑;冒号前面的是返回值
print(res(1))

列表生成式

l = [i for i in range(1,101,2)]

列表生成式,只能用在列表中

先写循环,再把循环里的i拿出来,可以做一些简单的操作(补零、转换为字符串等)

import random
red_num = random.sample(range(1,34),6)
# new_num = []
# for num in red_num:
# #    print(num)     num  是int类型
#     tmp = str(num).zfill(2)  #补2位
#     new_num.append(tmp)
new_num = [str(num).zfill(2) for num in red_num]   #列表生成式
print(new_num)        #['18', '22', '04', '09', '28', '33']

l =[i for i in range(1,101,2)] #列表生成式  生成100以内的奇数
print(l)

 

三元运算符

a = 5
b = 4
if a>b:
    c =a
else:
    c = b

c = a if a>b else b   #三元表达式
print(c)   5

 

声明入参格式

仅仅是为了代码易读,并不会强制转换类型

def my(name:str):#告诉别人name是str,但不会强制转化,l:list告诉别人传入是list
   print(name)
my('hello')
my(['123',123])#入参是list也可以,['123', 123]

 

posted @ 2018-05-23 16:30  xiaomeng15  阅读(106)  评论(0编辑  收藏  举报