分类: Python/Ruby
2016-11-28 15:12:21
函数分为:自定义函数,内置函数
自定义函数
1,def
2,名字
3,函数体
4,返回值
注意:
a,函数执行顺序,程序只会把函数放到内存中去,函数体在不调用时并不会执行。
b,当函数执行到return返回值时,将不会再往下执行了。如果函数中没有返回值,
在其他语言中是不会有返回值的,但是在python中默认也有返回值None。
1,普通参数 例如,def f1(name ):
2,默认参数(默认参数必须放到参数列表的最后,如果放到普通参数前会报错!)
例如:
def f2(name,password='123',content='ok'):
print(name,password,content)
3,指定参数(即在传参的时候指定那个参数是谁)
例如:上例中已经定义好了函数,f2(pass='456',name='yn')
4,动态参数
1)* 一个星号
def f2(*args):
print(args,type(args))
注意以下两点:
a,默认将传入的参数全部放置在元组当中,
b,但是如果传参时加上*,则会直接将参数中的元素放到元组中。
- 如: li = ['yn','123','ok']
- f2(li)
- f2(*li)
- 结果如下:
- (['yn', '123', 'ok'],) <class 'tuple'> #直接把列表当成一个元素放到元组中
- ('yn', '123', 'ok') <class 'tuple'> #会把列表中的元素放到元组中
2)** 两个星号
def f2(**kwargs):
print(kwargs,type(kwargs))
注意以下两点:
a,默认将传入的参数全部放置在字典当中,
b,如果在传参时加两个星号,则会直接将参数中的元素放到字典当中。
- 如:dic1 = {'k1': 'yn', 'k2': 'alex'}
- f2(name='yn')
- f2(**dic1)
- 结果如下:
- {'name': 'yn'} <class 'dict'> #直接把key和value放到字典中
- {'k2': 'alex', 'k1': 'yn'} <class 'dict'> #直接把字典dic1中的元素放到字典中
5,万能参数(自定义的)
- def f1(*args,**kwargs): #*args **kwargs注意在定义时顺序不能调换
- print(args)
- print(kwargs)
- f1(11,22,33,k1='yn',k2='alex')
- 结果如下:
- (11, 22, 33)
- {'k2': 'alex', 'k1': 'yn'}
应用:利用动态参数实现format功能,S.format(*args, **kwargs) -> str
- s1 = 'my name is {0}, my age is {1}'
- print(s1.format('yn','16'))
- li = ['yn',16]
- print(s1.format(*li))
- s2 = 'my name is {name},my age is {age}'
- print(s2.format(name='yn', age=16 ))
- dic1 = {'name': 'yn', 'age': 16}
- print(s2.format(**dic1))
- 结果如下:
- my name is yn, my age is 16
- my name is yn,my age is 16
- my name is yn, my age is 16
- my name is yn,my age is 16
1,定义同名的函数,只有最后定义的那个函数才会生效,前面的会被垃圾回收掉。
2,参数传值,注意传的是引用(新浪的面试题)
如:
name_li = ['yn','alex']
def f1(username):
username.append('eric')
name_li = ['yn','alex']
f1(name_li)
print(name_li)
结果如下:
['yn', 'alex', 'eric'] #试想:如果传的是新的赋值,结果应该是['yn', 'alex']
3,全局变量,所有的作用域都可读。而在定义的def函数内部的变量则属于局部变量,只
对该函数生效,如果想在自定义的函数中修改全局变量,需要:global name ,然后再定义
即可对全局变量重新赋值。但是对于像列表、字典、嵌套有列表的元组这样的全局变量,
在不使用global的情况下,自定义的函数中全局变量可修改但是不可重新赋值(意思是重
新赋值只会在当前函数中生效,而修改则会在接下来所有的函数中生效,相当于修改了全
局变量)。
4,一定注意在定义全局变量的时候,一定要大写。如,NAME = 'Alex'等。
- 1)如:
- NAME = 'Alex'
- def f1():
- age = 19
- global NAME
- NAME = 'yn'
- print(NAME, age)
- def f2():
- age = 18
- print(NAME,age)
- f1()
- f2()
- 结果如下:
- yn 19
- yn 18
- 2)如:
- NAME = [ 'Alex','eric']
- def f1():
- age = 19
- # global NAME
- NAME.append('yn') #修改会在接下来的函数中也生效,成为全局变量
- print(NAME, age)
- def f2():
- age = 18
- print(NAME,age)
- f1()
- f2()
- 结果如下:
- ['Alex', 'eric', 'yn'] 19
- ['Alex', 'eric', 'yn'] 18
cat user.txt
- #_*_ coding:utf-8 _*_
- import sys
- def login(username, password):
- """
- 用户登录验证
- :param username:输入的用户名
- :param password: 输入的密码
- :return: 返回值为True,登录成功;返回值为False,登陆失败。
- """
- with open('user.txt') as f1:
- for line in f1:
- r = line.strip('\n').split(':')
- if r[0] == username and r[1] == password:
- return True #用for循环进行逐行匹配,匹配成功,返回值True,退出
- return False #如果没有成功则返回False
- def register(username, password):
- """
- 用户注册
- :param username:输入要注册的用户名
- :param password: 输入要注册的密码
- :return: 默认返回值None
- """
- with open('user.txt','a') as f2:
- name_str = '\n' + username + ':' + password
- f2.write(name_str)
- def main():
- """
- 登陆主程序
- :return: 默认为None
- """
- res1 = input('请输入你的选择:1.登录 2.注册')
- if res1 == '1':
- username = input('请输入登录用户名:')
- password = input('请输入登录密码:')
- res2 = login(username, password)
- if res2 == True:
- print('登录成功')
- else:
- print('登录失败')
- elif res1 == '2':
- username = input('请输入要注册的用户名:')
- password = input('请输入要注册的密码:')
- register(username, password)
- else:
- sys.exit('输入错误!')
- main()
lily:123
alex:123