- 函数代码块以def关键字开头,后接函数标识符名称和圆括号()
- 所有传入的参数和自变量都必须放在圆括号内,可以在圆括号中定义参数。
- 函数的第一行语句可以选择性使用文档字符串,用于存放函数说明。
- 函数内容以冒号:开始,并且要缩进。
- return [表达式]结束函数,选择性返回一个值给调用方。不带表达式的return相当于返回None。
- return有两个作用:
用来返回函数的运行结果,或者调用另外一个函数。
函数结束的标志。只要运行了return,就强制结束了函数。return后面的程序都不会被执行。其实,函数不一定有返回值。什么都不返回的函数不包含return语句,或者包含return语句,但没有在return后面指定值。
if __name____=='___main____' 具体介绍:案例说明
1-先创建一个file.py的文件
pi=3.1415926
def file():
print('圆周率是: %s' %(pi)) #格式化输出
file()
#输出为:圆周率是:3.1415926
2-在创建另外一个file2.py的文件 ,调用file的pi的值,
两个文件在一个路径下:
from file import pi
def calc_round(rad): #定义圆形面积求解函数
return pi * (rad ** 2)
def run():
print ("圆形面积为:",cale_round(5)) #调用函数
run()
#输出为: 圆周率是:3.1415926
#圆形面积为:78.539815
可以看出来把“ 圆周率是:3.1415926” 这个也输出来了。
因为第一个程序里面没有加入if __name__ == '__main__',
3-增加第一个file.py的函数的主函数判断:
pi=3.1415926
def file():
print('圆周率是: %s' %(pi)) #格式化输出
if __name__ == '__main__':
file()
4-在运行file2.py 可以看出只有 “圆形面积为:78.539815”这一条输出了。
1.直接运行:就是直接运行.py文件,name也就是main.程序运行。
2.模块导入:就是被当成模块导入到其他python文件中使用,name为模块的名字。
所以,if ___name____ == '____main____' 我们简单的理解就是: 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行.
基础传参
定义传参:
def get_info(name,age):
print('%s is %s years old' %(name,age)) #格式化输出
if __name__=='__main__:'
get_info('bob',25)
get_info(name='bob',age=25) #这种方法也可以
#输出为:bob is 25 years old
非定义传参,多个传参,需要通过*元组或者**字典来定义:
def fun1(*args): #args 是元组
print(args)
def fun2(**kwargs): #kwargs是表示字典
print(kwargs)
def fun3(*args,**kwargs):
print(args,kwargs)
if __name__=='__main__':
fun1()
fun1('hao')
fun1('hao',123)
fun1('hao',123,'hello')
fun2(name='wang',age=27)
fun3('hao',name='wang',age=27)
#输出为:age(‘hao’)
#('hao',123,'hello')
#('name':'wang','age':27)
#(‘hao’,){name='wang',age=27}
列表字典传参
def add(x,y):
print(x+y)
def get_info(name,age):
print('%s is %s years old ' % (name,age))
if __name__=='___main__':
nums =[10,5]
add(nums[0],nums[1]) #第一种方法传递
add(*num) #第二种方法将列表插开依次传参
get_info(age=27,name='wang')
user = {'name':'wang','age':27}
get_info(**user) #将字典插开,拆成key=value的形式进行传参
#输出为:15
#wangh is 27 years old
举例说明,在python核心编程第二版有个这个样的例子:
from random import randint,choice
from operator import add,sub
def add(x,y):
return x + y
def sub(x,y):
return x - y
def exam():
cmds={'+':add,'-':sub}
#cmds = {'+':lambda x,y:x + y,'-':lambda x,y : x - y} #通过把匿名函数放到里面
nums = [randint(1,100) for i in range(2)] #从1到100,随机出来2个
nums.sort(reverse=True) #默认是False ,实现降序的排列
op = choice('+-')
result = cmds[op](*nums)
prompt = '%d %s %d =' %(nums[0],op,nums[1])
counter = 0
while counter < 3:
try: #不显示错误类型,错误类型是空白,如果不是数字的话,则继续
answer = int(input(prompt))
except:
continue
if answer == result:
print("very good")
break
else:
print('wrong answer')
counter +=1
else:
print("the answer:")
print('%s %s' % (prompt,result))
if __name__ =='__main__':
while True:
exam()
try:
#去除两边的空白,然后在取出第一个字符
yn = input('continue(y/n)?').strip()[0].lower() #把字母变成小写
except IndexError: #按回车是indexError,默认是y
continue
except (KeyboardInterrupt, EOFError): #按ctrl +c 或者 ctrl + d 的错误类型
yn = 'n' #默认为n
if yn in 'nN':
print('\nBye-bye')
break
高阶传参
通过函数 filter() 函数来调用函数,参数也是函数
通过函数 map() 函数来调用函数。
from random import randint
def func1(x):
return x % 2 #求偶数
def func2(x):
return x * 2 +1
if __name__ == '__main__':
nums=[randint(1,100) for i in range(10)] #随机在1-100中选择10个数字
print(nums)
print(list(filter(fun1,nums)))
#filter()要求第一个是函数,第二个充当x传递函数,返回True保留,返回False过滤掉
print(list(filter(lambda x : x % 2,nums))) #通过匿名函数来定义输出
print(list(map(func2,nums)))
print(list(map(lambda x:x * 2 +1,nums))) #通过匿名函数来定义
#输出结果为:
[8,44,21,23,44,55,67,33,2,1]
[35,51,7,69]
[35,51,7,69]
[39,65,33,11,33,57,13,79,91,43]
文件传参
通过运行一个file.py文件,来修改里面的内容
python file.py file.txt True False
将file.txt里面的内容的 True 更改为 False
file.txt 为file1
True 为file2
False 为file3
from os import remove,rename
from shutil import copy,copy2
from time import strftime,localtime
from sys import argv
localtime = strftime("%Y%m%d", localtime())
def word(file1,file2,file3):
file2 = file1 + '.bak' + localtime
tmp_file = file1 + '.temp'
copy2(file1, file2) #拷贝一个源文件
with open(file1, mode='r') as fr, open(tmp_file, mode='w') as fw:
for line in fr:
if file2 in line:
fw.write(line.replace(file2, file3))
else:
fw.write(line)
print("已将%s替换为%s"%(file2,file3))
remove(file1)
rename(tmp_file, file1)
return
if __name__ == "__main__":
try:
if len(sys.argv) == 4:
file1, file2, file3 = sys.argv[1:] #从左到右进行切片,分别给三个赋值
word(file1, file2, file3)
else:
print("传参失败,请确定参数是否正确")
except (KeyboardInterrupt,EOFError,ValueError):
print("请输入正确参数")
#python 中也可以使用 sys 的 sys.argv 来获取命令行参数:
#sys.argv 是命令行参数列表。
#len(sys.argv) 是命令行参数个数。
#sys.argv[0] 表示脚本名
网友评论