Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86511
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-12 22:31
文章分类

全部博文(26)

文章存档

2016年(26)

我的朋友

分类: 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,但是如果传参时加上*,则会直接将参数中的元素放到元组中。


  1. 如: li = ['yn','123','ok']
  2.      f2(li)
  3.      f2(*li)
  4. 结果如下:
  5. (['yn', '123', 'ok'],) <class 'tuple'>     #直接把列表当成一个元素放到元组中
  6. ('yn', '123', 'ok') <class 'tuple'>        #会把列表中的元素放到元组中


2)** 两个星号
def f2(**kwargs):
    print(kwargs,type(kwargs))

注意以下两点:
a,默认将传入的参数全部放置在字典当中,
b,如果在传参时加两个星号,则会直接将参数中的元素放到字典当中。


  1. 如:dic1 = {'k1': 'yn', 'k2': 'alex'}
  2.     f2(name='yn')
  3.     f2(**dic1)        
  4. 结果如下:
  5. {'name': 'yn'} <class 'dict'>    #直接把key和value放到字典中
  6. {'k2': 'alex', 'k1': 'yn'} <class 'dict'>    #直接把字典dic1中的元素放到字典中




5,万能参数(自定义的)


  1. def f1(*args,**kwargs):    #*args **kwargs注意在定义时顺序不能调换
  2.     print(args)
  3.     print(kwargs)
  4. f1(11,22,33,k1='yn',k2='alex')
  5.         
  6. 结果如下:
  7. (11, 22, 33)
  8. {'k2': 'alex', 'k1': 'yn'}


应用:利用动态参数实现format功能,S.format(*args, **kwargs) -> str


  1. s1 = 'my name is {0}, my age is {1}'
  2. print(s1.format('yn','16'))
  3. li = ['yn',16]
  4. print(s1.format(*li))


  5. s2 = 'my name is {name},my age is {age}'
  6. print(s2.format(name='yn', age=16 ))
  7. dic1 = {'name': 'yn', 'age': 16}
  8. print(s2.format(**dic1))
  9.         
  10. 结果如下:
  11. my name is yn, my age is 16
  12. my name is yn,my age is 16
  13. my name is yn, my age is 16
  14. 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. 1)如:
  2. NAME = 'Alex'
  3. def f1():
  4.     age = 19
  5.     global NAME
  6.     NAME = 'yn'
  7.     print(NAME, age)

  8. def f2():
  9.     age = 18
  10.     print(NAME,age)

  11. f1()
  12. f2()
  13.     

  14. 结果如下:
  15. yn 19
  16. yn 18

  17.     
  18. 2)如:
  19. NAME = [ 'Alex','eric']
  20. def f1():
  21.     age = 19
  22. # global NAME
  23.     NAME.append('yn') #修改会在接下来的函数中也生效,成为全局变量
  24.     print(NAME, age)

  25. def f2():
  26.     age = 18
  27.     print(NAME,age)

  28. f1()
  29. f2()

  30. 结果如下:
  31. ['Alex', 'eric', 'yn'] 19
  32. ['Alex', 'eric', 'yn'] 18

四,函数式编程实现登录和注册,规范写法。


  1. #_*_ coding:utf-8 _*_
  2. import sys


  3. def login(username, password):
  4.     """
  5.     用户登录验证
  6.     :param username:输入的用户名
  7.     :param password: 输入的密码
  8.     :return: 返回值为True,登录成功;返回值为False,登陆失败。
  9.     """
  10.     with open('user.txt') as f1:
  11.         for line in f1:
  12.             r = line.strip('\n').split(':')
  13.             if r[0] == username and r[1] == password:
  14.                 return True #用for循环进行逐行匹配,匹配成功,返回值True,退出
  15.         return False #如果没有成功则返回False


  16. def register(username, password):
  17.     """
  18.     用户注册
  19.     :param username:输入要注册的用户名
  20.     :param password: 输入要注册的密码
  21.     :return: 默认返回值None
  22.     """
  23.     with open('user.txt','a') as f2:
  24.         name_str = '\n' + username + ':' + password
  25.         f2.write(name_str)


  26. def main():
  27.     """
  28.     登陆主程序
  29.     :return: 默认为None
  30.     """
  31.     res1 = input('请输入你的选择:1.登录 2.注册')
  32.     if res1 == '1':
  33.         username = input('请输入登录用户名:')
  34.         password = input('请输入登录密码:')
  35.         res2 = login(username, password)
  36.         if res2 == True:
  37.             print('登录成功')
  38.         else:
  39.             print('登录失败')
  40.     elif res1 == '2':
  41.         username = input('请输入要注册的用户名:')
  42.         password = input('请输入要注册的密码:')
  43.         register(username, password)
  44.     else:
  45.         sys.exit('输入错误!')
  46. main()
cat user.txt
lily:123
alex:123



阅读(1368) | 评论(0) | 转发(0) |
0

上一篇:shooping_car

下一篇:内置函数

给主人留下些什么吧!~~