python 函数之day3
一 函数的语法及特性
什么是函数?
定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可。
特性:
- 减少重复代码
- 使程序变的可扩展
- 使程序变得易维护
定义函数
>>> def hello(): #def 关键字 hello 函数名 print('Hello,world!') >>> hello() #通过名字调用函数 Hello,world! >>> def product(x,y): #传入两个参数,返回两个数的乘积 result = x*y return(result) >>> product(5,7) #调用函数 35
程序断点运行(可以调试的时候用到)
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2016/10/16 20:06 4 # @Author : Derby 5 # @File : SendMail.py 6 import smtplib 7 from email.mime.text import MIMEText 8 from email.utils import formataddr 9 10 def sendMail(): 11 try: 12 msg = MIMEText('邮件内容', 'plain', 'utf-8') 13 msg['From'] = formataddr(["derby", 'dbb-2008@163.com']) 14 msg['To'] = formataddr(["dbb", '499245549@qq.com']) 15 msg['Subject'] = "主题" 16 17 server = smtplib.SMTP("smtp.163.com", 25) 18 server.login("dbb-2008@163.com", "邮箱密码") 19 server.sendmail('dbb-2008@163.com', ['499245549@qq.com', ], msg.as_string()) 20 server.quit() 21 except: 22 return "发送失败" 23 else: 24 return '发送成功' 25 26 result=sendMail() 27 print(result)
函数返回之return
要想获取函数的执行结果,就可以用return语句把结果返回
注意:
- 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
- 如果未在函数中指定return,那这个函数的返回值为None
1 def f1(): 2 print ('deng') 3 return '111' #在函数中,一旦执行return,函数立即终止 4 print ('derby') 5 6 r=f1() 7 print(r) 8 #执行结果 9 deng 10 111 11 12 def f2(): 13 print('derby') #函数中没有return,默认返回None 14 15 re=f2() 16 print(re) 17 18 #执行结果 19 derby 20 None
函数的参数
1.普通参数 通过调用函数,传入参数,并且一一对应
1 #定义和调用函数 2 def f1(name): #name为f1函数的形式参数,简称:形参 3 print ('Hello,%s'%name) 4 return 'yes' 5 6 r=f1('derby') #derby为传入f1的实际参数,简称:实参 7 print(r) 8 9 Hello,derby
2.默认参数 默认参数要放在参数列表的最后
1 def f1(name,classroom=13): 2 print ('Hello,%s you classroom is %s'%(name,classroom)) 3 return 'yes' 4 5 r1=f1('derby',15) #指定参数 6 7 r=f1('derby') #使用默认的参数 8 9 结果: 10 Hello,derby you classroom is 15 11 Hello,derby you classroom is 13
3.指定参数 正常情况下,给函数传参数要按顺序,不想按顺序就可以用指定参数,只需指定参数名即可
但记住一个要求就是,关键参数必须放在位置参数之后。
1 def f1(name,classroom=13): 2 print ('Hello,%s you classroom is %s'%(name,classroom)) 3 return 'yes' 4 5 r=f1(classroom=15,name='hangbazi')
4.动态参数 一个形参可以接受多个参数,一个"*"默认放在元祖里,两个"**"默认放在字典里
1 def f1(classroom,*name): 2 print ('Hello,%s your classroom is %s'%(name,classroom)) 3 return 'yes' 4 5 li=['cangjingkong','wutonglan','marliya'] 6 7 #使用方式一,一个一个的传入 8 f1(15,'cangjingkong','wutenglan','mariya') 9 10 #使用方式二,列表的方式传入 11 f1(15,*li) #传入多个参数时,相当于做for循环加入元祖 12 f1(15,li) ##默认情况会把传进来的参数,放进一个元祖里 13 14 结果: 15 Hello,('cangjingkong', 'wutenglan', 'mariya') your classroom is 15 16 Hello,('cangjingkong', 'wutonglan', 'marliya') your classroom is 15 17 Hello,(['cangjingkong', 'wutonglan', 'marliya'],) your classroom is 15
1 def f1(classroom,**name): 2 print ('Hello,%s your classroom is %s'%(name,classroom)) 3 return 'yes' 4 5 #li=['cangjingkong','wutonglan','marliya'] 6 dic={'name1':'cangjingkong','name2':'wutenglan','name3':'marliya'} 7 8 #使用方式一,一个一个的传入 9 f1(15,name1='cangjingkong',name2='wutenglan',name3='mariya') 10 11 #使用方式二,字典的方式传入 12 f1(15,**dic) 13 14 结果: 15 Hello,{'name3': 'mariya', 'name2': 'wutenglan', 'name1': 'cangjingkong'} your classroom is 15 16 Hello,{'name3': 'marliya', 'name2': 'wutenglan', 'name1': 'cangjingkong'} your classroom is 15
1 #注意万能参数用法一个*在前,两个** 在后 2 3 def f1(*classroom,**name): 4 print ('Hello,%s classroom in %s'%(name,classroom)) 5 return 'yes' 6 7 li=[15,16,17] 8 dic={'name1':'cangjingkong','name2':'wutenglan','name3':'marliya'} 9 10 #使用方式一,一个一个的传入 11 f1(15,16,17,name1='cangjingkong',name2='wutenglan',name3='mariya') 12 13 #使用方式二,字典列表的方式传入 14 15 f1(*li,**dic) 16 17 结果: 18 Hello,{'name1': 'cangjingkong', 'name3': 'mariya', 'name2': 'wutenglan'} classroom in (15, 16, 17) 19 Hello,{'name1': 'cangjingkong', 'name3': 'marliya', 'name2': 'wutenglan'} classroom in (15, 16, 17)
1 #format 格式化输出普通用法 2 >>> s = 'I am {0},age:{1}' #{0}{1}为占位符 3 >>> s.format('derby',18) 4 'I am derby,age:18' 5 >>> s.format(*['derby',19]) #使用动态参数用法 6 'I am derby,age:19' 7 8 #上面传入为tumple,还可以传入字典 9 10 >>> s = 'I am {name},age:{age}'.format(name='derby',age=18) 11 >>> print (s) 12 I am derby,age:18 13 14 #传入字典方式 15 >>> dic = {'name':'derby','age':18} 16 >>> s.format(**dic) 17 'I am derby,age:18'
函数补充知识点
Python中传递参数是复制一份传入,还是应用传入的参数?
1 >>> def f1(a1): 2 a1.append(999) 3 4 5 >>> li=[11,22,33,44] 6 >>> print(f1(li)) #当函数没有return 返回None 7 None 8 >>> print(li) #可以看出行数传参是引用 9 [11, 22, 33, 44, 999]
Python 函数的变量
1 #局部变量 2 3 >>> def f1(): #局部变量name 只能在函数内进行调用 4 name='derby' 5 print(name) 6 >>> def f2(): #无法调用上面的局部变量 7 print(name) 8 9 #全局变量 潜规则:全局变量都大写 10 #注意对于字典,列表,读的时候可以修改,不可重新赋值 11 12 >>> NAME='derby' #定义全局变量 13 >>> def f1(): 14 age=18 15 NAME='123' #局部赋值只能在函数内部使用 16 #gloab NAME #重新全局赋值使用 gloab NAME 17 print(age,NAME) 18 19 >>> def f2(): 20 age=19 21 print(age,NAME) 22 23 >>> f1() 24 18 123 25 >>> f2() 26 19 derby
三元运算
三元运算(三目运算),是对简单的条件语句的缩写。
1 #书写格式 2 3 return =值1 if 条件成立 else 值2 4 5 # 如果条件成立,那么将 “值1” 赋值给result变量,否则,将“值2”赋值给result变量 6 7 示例 8 x="derby" if 19>18 else "alex"
lambda 表达式
1 #普通定义函数返回值 2 >>> def f1(a1): 3 return a1+100 4 5 #使用lambda表达式 6 >>> f2 = lambda a1,a2:a1+a2+120 7 8 >>> f1(120) 9 220 10 >>> f2(120,130) 11 370
内置函数
Python所有的内置函数如下:
内置函数使用示例
1 >>> n=abs(-1) 2 >>> print(n) 3 1
1 #python 中 布尔为False有 0,None,' ',[],() 2 >>> print(bool(0)) 3 False 4 >>> print(bool(None)) 5 False 6 >>> print(bool('')) 7 False 8 >>> print(bool([])) 9 False 10 >>> print(bool(())) 11 False 12 #all 只要有一个为False 即False 13 >>> n = all ([1,2,3,None]) 14 >>> print (n) 15 False 16 #any 只要有一个为真即为True 17 >>> n = any([0,'',None,13]) 18 >>> print (n) 19 True
1 #进制转换 2 >>> print(bin(10)) #转换成二进制0b 3 0b1010 4 >>> print(oct(10)) #转换成8进制 0o 5 0o12 6 >>> print(hex(10)) #转换成16进制0x 7 0xa
1 # bytes 字符串转换成字节,表现形式为16进制,占用空间最少 2 >>> s = '等一程' 3 >>> n = bytes(s,encoding='utf-8') #utf-8编码一个汉字为3个字节 4 >>> print(n) 5 b'\xe7\xad\x89\xe4\xb8\x80\xe7\xa8\x8b' 6 >>> n = bytes(s,encoding='gbk') #GBK编码一个汉字为2个字节 7 >>> print (n) 8 b'\xb5\xc8\xd2\xbb\xb3\xcc' 9 10 #字节编码成字符串 11 >>> s = str(bytes(s,encoding='utf-8'),encoding='utf-8') 12 >>> print (s) 13 等一程
1 #callable 检测能否传入的值能否被调用 2 def f1(): 3 pass 4 5 f2 = 123 6 7 print(callable(f1)) 8 print(callable(f2)) 9 j结果: 10 Ture 11 False 12 13 #对照ASCII码表 将数字转化成字母 14 >>> r = chr(65) 15 >>> print (r) 16 A 17 #对照ASCII标码表 将字母转化成数字 18 >>> r = ord("a") 19 >>> print(r) 20 97
1 import random 2 3 #创建6个大写的字母 4 li = [] 5 for i in range(6): 6 temp = random.randrange(65,91) 7 c = chr(temp) 8 li.append(c) 9 result = ''.join(li) 10 print(result) 11 12 13 ASWEFK
1 #生成数字字母随机数 2 li = [] 3 for i in range(6): 4 if i == 2 or i==4: 5 temp = random.randrange(0,10) 6 #c = chr(temp) 7 li.append(str(temp)) 8 else: 9 temp = random.randrange(65, 91) 10 c = chr(temp) 11 li.append(c) 12 result = ''.join(li) 13 print(result)
1 #生成完全随机数 2 li = [] 3 for i in range(6): 4 r = random.randrange(0,5) 5 if i == 2 or i==4: 6 temp = random.randrange(0,10) 7 #c = chr(temp) 8 li.append(str(temp)) 9 else: 10 temp = random.randrange(65, 91) 11 c = chr(temp) 12 li.append(c) 13 result = ''.join(li) 14 print(result)
重要函数值 complile(),evel(),exec()
1 #compile() 编译字符成Python代码 2 #exec() 编译成跟Python一样的代码,只执行,没有返回值 3 4 s = 'print(123)' 5 #将字符串编译Python代码 6 r = compile(s,'<string>','exec') 7 #执行Python代码 8 exec(r) 9 结果: 10 123 11 12 #eval() 只编译执行表达式,有返回值 13 t = "8*8" 14 ret = eval(t) 15 print (ret) 16 结果: 17 64
1 # dir 快速查看,对象提供了哪些功能 2 #print(dir(list)) 3 #print(dir(dict)) 4 # help 查看对象的帮助,有哪些参数 5 #help(list) 6 7 #做除法,返回商,和余数 8 n1,n2 = divmod(9,5) 9 print(n1,n2) 10 1 4 11 12 s = "derby" 13 ret = isinstance(s,list) #判断某个对象是否是某个类的实例 14 print(ret) 15 16 False
1 #filter 过滤 2 def f2(a): 3 if a > 22: 4 return True 5 li = [11,22,33,44,55,66] 6 #filter内部,循环第二个参数,将每个元素传入第一个函数 7 #如果函数返回值为True,则元素合法,加入filter内部列表 8 ret = filter(f2,li) 9 print(list(ret)) 10 结果:[33,44,55,66] 11 12 #lamdba 函数能自动return 13 f1 = lambda a: a >30 14 ret = f1(90) 15 print(ret) 16 True 17 #filter 和lambda 结合使用 18 result = filter(lambda a:a>22,li) 19 print (list(result)) 20 结果:[33,44,55,66] 21 22 23 24 #map (函数,可迭代的对象(可以for循环的东西)将后面的参数依次传入前面的函数,结果写入列表) 25 li = [11,22,33,44,55,66] 26 #def f2(a): 27 # return a+100: 28 29 #result = map(f2,li) 30 result = map(lambda a: a+100,li) 31 print (list(result))
1 #globals () 打印所有的全局变量 locals() 打印所有的局部变量 2 NAME='derby' 3 def f2(): 4 a=123 5 b=a+100 6 print(locals()) # 打印a,b 为局部变量 7 print(globals()) #打印NAME 和系统内置的全局变量 8 9 f2() 10 11 12 #hash()将一个传入的对象,转为哈希值,一般在字典里使用 13 #作用一节省内存空间,作用二,根据哈希值查找方便 14 15 >>> s = 'marliyasdfdfdfsdfdfsdf' 16 >>> print(hash(s)) 17 -7295414716637379284 18 >>> 19 #python 3.x 默认是按字符找,2.0 默认是按字节找 20 >>> s='中国' 21 >>> print(len(s)) 22 2 23 >>> b = bytes(s,encoding='utf-8') 24 >>> print(len(b)) 25 6
1 # sum() 求和 max() 最大值 min()最小值 2 print(sum([11,23,34,12])) 3 print(max([11,23,34,12])) 4 print(min([11,23,34,12])) 5 6 # pow() 求平方 7 r = pow(2,10) 8 print(r) 9 10 li= [23,42,23] 11 # repr() 执行类中的 _repr_ 函数 12 repr('dengbin') 13 14 #reversed() 反转 15 reversed(li) 16 17 #round() 四舍五入 18 print(round(1.23))
1 #sorted 排序 2 >>> li=[23,45,43] 3 >>> print(sorted(li)) 4 [23, 43, 45] 5 >>> 6 7 #zip () 将几个列表对应的元素放进一个元组里 8 9 l1 = ['deng',11,23] 10 l2 = ['bin','11',22] 11 r = zip(l1,l2) 12 #print(list(r)) #结果:[('deng', 'bin'), (11, '11'), (23, 22)] 13 temp = list(r)[0] 14 print (temp) 15 ret = ' '.join(temp) 16 print(ret) 17 18 结果: 19 ('deng', 'bin') 20 deng bin
盛年不再来,一日难再晨,及时当勉励,岁月不待人。
——陶渊明