文章目录
函数
基本语法
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")