一 函数的语法及特性
什么是函数?
定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可。
特性:
- 减少重复代码
- 使程序变的可扩展
- 使程序变得易维护
定义函数
>>> 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 deng10 11111 12 def f2():13 print('derby') #函数中没有return,默认返回None14 15 re=f2()16 print(re)17 18 #执行结果19 derby20 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 1511 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 1516 Hello,('cangjingkong', 'wutonglan', 'marliya') your classroom is 1517 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 1516 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 返回None7 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=1815 NAME='123' #局部赋值只能在函数内部使用16 #gloab NAME #重新全局赋值使用 gloab NAME17 print(age,NAME)18 19 >>> def f2():20 age=1921 print(age,NAME)22 23 >>> f1()24 18 12325 >>> f2()26 19 derby
三元运算
三元运算(三目运算),是对简单的条件语句的缩写。
1 #书写格式2 3 return =值1 if 条件成立 else 值24 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 22010 >>> 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 False10 >>> print(bool(()))11 False12 #all 只要有一个为False 即False13 >>> n = all ([1,2,3,None])14 >>> print (n)15 False16 #any 只要有一个为真即为True17 >>> n = any([0,'',None,13])18 >>> print (n)19 True
1 #进制转换2 >>> print(bin(10)) #转换成二进制0b3 0b10104 >>> print(oct(10)) #转换成8进制 0o5 0o126 >>> print(hex(10)) #转换成16进制0x7 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 Ture11 False12 13 #对照ASCII码表 将数字转化成字母14 >>> r = chr(65)15 >>> print (r)16 A17 #对照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,'','exec') 7 #执行Python代码 8 exec(r) 9 结果:10 12311 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 411 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 函数能自动return13 f1 = lambda a: a >3014 ret = f1(90)15 print(ret)16 True17 #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 -729541471663737928418 >>> 19 #python 3.x 默认是按字符找,2.0 默认是按字节找20 >>> s='中国'21 >>> print(len(s))22 223 >>> 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