python 函数 8/2

函数

基本语法

def 函数名(形参)

参数种类

大概规则:

不可变类型参数被函数调用时,是值传递,可变类型参数被函数调用时,是引用传递。

位置参数

按照位置放参数

def display_message(mesg,name):
    print("mesg"+mesg)
    print("name"+name)
display_message("函数","水")

在这里插入图片描述

关键字参数

其实就是直接在调用函数的时候指定了参数是哪个值。

def display_message(mesg,name):
    print("mesg"+mesg)
    print("name"+name)
display_message(name="函数",mesg="水")

在这里插入图片描述
指定的话要指定全 不要就指定一个 其他不指定 这样会抛出错误
在这里插入图片描述在这里插入图片描述

带默认值的形参

带有默认值的形参,如果没有指定就按位置参数,一个萝卜一个坑填,填完没了再按照默认值填。也支持使用关键值指定,剩下的再按照默认值填充。

def display_message(mesg="water",name="tree"):
    print("mesg  "+mesg)
    print("name  "+name)
display_message()

在这里插入图片描述

def display_message(mesg="water",name="tree"):
    print("mesg  "+mesg)
    print("name  "+name)
display_message(name="fire")

在这里插入图片描述

任意数量实参

基本语法

我觉得这个类似于函数最后一个参数类型是数组,可以放任意数量的参数,但是要在最后一个,不然不知道是怎么确定范围。
解释是python是创建了一个空的元组,说实话,元组真的搞不太懂,我觉得就像是内容不可以变的数组,但是又可以改变指向。be like要改改不了,直接炒掉换人。

def cook(*dish):
    for i in dish:
        print("配菜"+i)
cook("西瓜","番茄","小猪")

在这里插入图片描述

将任意参数的变量存成字典
def cook(type,**dish):#创建空字典
    print("种类为"+type)
    for key,value in dish.items():#给空字典加键值对
        dish[key]=value
    print(dish)
cook("中餐",主菜="猪肉",配菜="炒青菜")# cook(type,**dish)

函数首先创建了空字典dish,再在dish里面添加内容,后面两个参数被解释为字典的键值对,key=“value”。在调用函数的时候要使用关键字指定(键="值”)
在这里插入图片描述(还是有点不懂 希望以后越写越明白)

类作为函数参数

没查到很有道理的总结就自己尝试了一下。
python的函数参数类型不强制要求,所以好方便,也更宽松,只要那个类里面有这个函数里面用到的属性or函数,有attribute就ok,根本不管是什么类。(再次感叹 自由到有些不安。。。

import random
class Die():
    def __init__(self,sides=6):
        self.sides=sides

    def roll_die(self):
        print(random.randint(1,self.sides))

class Smile():
    def __init__(self,sides=6):
        self.sides=sides

    def roll_die(self):
        print("just smile;))))")


def shake_dice(aa):
    print("开始摇色子")
    for i in range(10):
        aa.roll_die()#这样写应该是期待一个有roll_die()函数的类,只有有一个类这样就ok
        			#并不强制要求是什么类 再次感叹一下python真的好自由

dice6=Die()
shake_dice(dice6)
shake_dice(Smile())#也是调用Smile.roll_die的函数 调用同名函数就ok
shake_dice(5)#AttributeError: 'int' object has no attribute 'roll_die'
dice10=Die(10)

在这里插入图片描述

返回值

返回值跟c++不一样,不在函数头表示返回值,就只return表示返回值。不强制规定python的返回值类型,一个函数可以有多种类型返回值(只能有一个返回值哈)

def testfun(a):
    if a:
        return "非空"
    else:
        return 22
        
c=testfun('aha')
print(c)
c=testfun("")
print(c)

在这里插入图片描述

传递函数

主函数向调用函数传递的参数是可变类型时,实际上是将实参的引用传入了调用函数,对引用的操作等于对其指定的对象进行操作。
如果函数传的参数是列表、字典应该传递的就是地址,如果在函数里面改了的话就会导致原先的列表、字典发生改变,应该可以类似c++的值传递。

def testfun(lista):
    for i in range(len(lista)):
        lista[i]=lista[i]+100
lista=[]
for i in range(10):
    lista.append(i)
testfun(lista)
print(lista)

在这里插入图片描述

禁止函数修改列表

使用切片[:]创建列表副本 函数传入副本,不对原来的列表操作,原来列表不发生改变

def testfun(lista):
    for i in range(len(lista)):
        lista[i]=lista[i]+100
lista=[]
for i in range(10):
    lista.append(i)
testfun(lista[:])
print(lista)

在这里插入图片描述

小练习(python 从编程到实战 p129)

def show_magicians(name):
    print("magican:"+name)
def make_great(lista):
    for i in range(len(lista)):
        lista[i]="the Great "+lista[i]
    return lista
names=["lily","wang","fun"]
m=make_great(names[:])
for i in names:
    show_magicians(i)
for i in m:
    show_magicians(i)   

封装函数成模块

直接import 要带文件名字

就是整成头文件呗,将函数文件当头文件引入。
还可以给模块(头文件)写别名,不过写了别名就只能用别名,就不能用原来的了,会出错。

import pizza as piz
piz.cook("西餐",main="beef")

在这里插入图片描述

import pizza as piz
pizza.cook("西餐",main="beef")

在这里插入图片描述

一个一个函数引 不用带名字

这样写就不用带文件名字 但是只要本文件跟模块的函数名重合就会引起覆盖,无论函数参数类型一不一样都会覆盖

基本语法

导入一个

from pizza import cook
cook("西餐",main="beef")

导入文件里面的全部函数

from pizza import *
cook("西餐",main="beef")
函数名一样,参数类型一样 覆盖
from pizza import cook
def cook(type,**dish):
    print("覆盖")
cook("西餐",main="beef")

在这里插入图片描述

函数名一样,参数类型不一样也覆盖
from pizza import cook
def cook():
    print("覆盖")
cook("西餐",main="beef")

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值