python零基础学习1-基础知识6-字符编码与函数

字符编码

  • 所有编码(unicode除外)之间的转换, 都要先转成unicode
  • unicode和GBK之间是不互相兼容的


 

函数

1.概述

1) 编程方法的分类

  • 面向对象: 类 class
  • 面向过程: 过程 def
  • 函数式编程: 函数 def (Fuctional Programming)
    • 函数没有变量, 没有副作用, 输入是确定的, 输出就是确定的
    • 主要思想是把运算尽量写成一系列嵌套函数的调用
    • 更接近数学运算. 如lisp语言

2) 函数的优点

  • 代码重用
  • 保持一致性
  • 可扩展性

3) 函数及过程的定义

#定义一个函数
def test(x):
    "函数的描述balabala"
    x+=1
    return x

#定义一个过程; 正常定义中, 过程是没有返回值的函数, 但在python中, 会返回None
def test1():
    "过程的描述balabala"
    pass

 

5) 函数的调用

  • 函数在被调用之前必须先定义
y=test(5)

 

 

2. return

    • 函数内部return之后会中止当前函数运行
    • 返回值可以直接赋予变量
    • 返回值的个数及类型都不确定
    • 可将多个变量赋予一个元组进行返回. eg. return 1, "hello", ["alex","bell"], {"name":"alex"}
    • 也可以返回函数 eg.return func_name # 返回函数的内存地址

 

3. 参数

  • 函数定义时指定的参数为形参
  • 函数调用时传入的参数为实参

1) 位置调用 (实参与形参一一对应)

def test(x, y):
    "计算两个数的加和"
    return x+y

a=test(1, 2)

2) 关键字调用 (与形参顺序无关)

def test(x, y):
    return x-y

a=test(y=3, x=8)

3) 默认参数: 提前为形参赋值, 调用时默认参数不是必传

def test(x, y=20):
    return x-y

a=test(100)

4. 参数组

def test(*args):
    print(*args)

test(1, 2, 3, 4, 5, 6)
test(*[7, 8, 9, 10, 11, 12])
#执行结果:
# 1 2 3 4 5 6
# 7 8 9 10 11 12
def test(x, *args):
    print(x)
    print(*args)

test(1, 2, 3, 4, 5, 6)
#执行结果:
# 1
# 2 3 4 5 6

**kwargs可接收N个关键字参数并转换成字典的形式

def test(**kwargs):
    print(kwargs)

test(name="alex",age=22, sex="M")
#执行结果:
# {'name': 'alex', 'age': 22, 'sex': 'M'}
def test(no,**kwargs):
    print(no,kwargs)

test("p001",name="alex",age=22, sex="M")
#执行结果:
# p001 {'name': 'alex', 'age': 22, 'sex': 'M'}

 

5. 作用域, 局部与全局变量

def change_name(name):
    print("before:",name)
    name="bell"           #局部变量, 只在函数里生效; 该函数为该变量的作用域
    print("after:", name)

name="alex"
change_name(name)
print(name)
#执行结果:
# before: alex
# after: bell
# alex
  • 在函数中操作全局变量的方法------------不要这么用
name="alex"

def change_name():
    global name
    name="bell"

print(name)
change_name()
print(name)
#执行结果:
# alex
# bell
  • 当全局变量为数字, 字符串时, 函数内部不能更改
  • 但当全局变量为列表, 字段, 集合, 类时, 函数内部可以更改
def change_name():
    a[0]="eva"

a=["alex","bell","maple"]
change_name()
print(a)

#执行结果:
# ['eva', 'bell', 'maple']

 

6. 递归: 在一个函数内部调用其本身

  • 必须有明确的结束条件
  • 进入下一层递归时, 问题规模应有所减小
  • 效率不高, 可能会导致栈溢出
  • 最大递归次数为999次
def calc(n):
    print(n)
    if n/2>=1:
        return calc(n/2)

calc(10)

 

7. 高阶函数: 函数参数可接收变量, 也可以接收另一个函数

def add(a, b, f):
    return f(a)+f(b)

print(add(3, -6, abs))
#执行结果:
# 9

 

posted on 2017-10-10 15:13  bell03  阅读(107)  评论(0)    收藏  举报

导航