聪明办法学Python第3节:变量与函数

作业链接:登录 - HydroOJ

变量 Variables

A variable is a named value that references or stores a piece of data.

  • 变量是一个名字,它所指代的是一段数据
  • 使用 = 来对这段数据的区域进行赋值
x = 5
print(x)   #5
print(x*2) #10
  • 新的值会覆盖掉旧的值
  • 新值的数据类型不必与旧值相同 (与c语言不同)
y = 10
print(y - 2) #8
y = True
print(y) #True
注: b=a,b与a引用相同的对象,改变b的值后会引用新的对象
a = 2
b = a

print(a) #2
print(b) #2

print(id(a)) #打印a的地址,1696244171024
print(id(b)) #打印b的地址,1696244171024
#a和b的地址相同,引用同一对象

b = 3    #改变b的值

print(a) #2
print(b) #3

print(id(a))  #1696244171024
print(id(b))  #1696244171056
#b的地址发生改变,引用新的对象

变量命名规则:

  • 必须以字母或下划线(_)开头
  • 命名可由字母、数字和下划线组成
  • 大小写敏感
  • 尽量避免使用保留字命名
numberOfRabbits = 40
courseIs15112 = True
99problems = 0 # 会崩溃!因为变量名以数字开头

保留字

['False',
 'None',
 'True',
 '__peg_parser__',
 'and',
 'as',
 'assert',
 'async',
 'await',
 'break',
 'class',
 'continue',
 'def',
 'del',
 'elif',
 'else',
 'except',
 'finally',
 'for',
 'from',
 'global',
 'if',
 'import',
 'in',
 'is',
 'lambda',
 'nonlocal',
 'not',
 'or',
 'pass',
 'raise',
 'return',
 'try',
 'while',
 'with',
 'yield']

更新变量 

x = 5
x += 2 # 等价于 x = x + 2
print(x) # 7

# 换成其他运算符也是同理
y = 350
y //= 10
print(y) # 35

多变量赋值

a = b = c = 2
print(f"a={a}, b={b}, c={c}")
#a=2, b=2, c=2

a, b, c = 1, 2, 6 #元组的解包
print(f"a={a}, b={b}, c={c}")
#a=1, b=2, c=6

函数 Functions

A function is a procedure (a sequence of statements) stored under a name that can be used repeatedly by calling the name.

  • 函数是一个名字,代表一串代码序列(流程、过程)
  • 函数由两个部分组成:header 和 body
    • header 用于定义函数接口(函数 名称 与 参数
    • body 包含函数所需要执行的操作

header 用于定义函数的名称参数

  • 当函数被调用时,参数将会作为变量被提供给函数的 body 部分
  • 可以提供多个参数(用逗号 , 分隔),也可以不提供参数(0 个)
  • header 以冒号(:)结尾,代表后面会跟着 body 部分

函数的 header 的写法:

def functionName(parameters):
    pass # 函数的 body 部分,这里使用 pass 代替

body

body 包含函数执行的语句(statement

  • 语句需要缩进(由 Code Style Guide 决定)
  • 当语句不再缩进,函数部分结束
  • 一般会使用 return 语句,来让函数返回其结果,但不是必须的。(类似于用一个 = 来对多个变量赋值,函数的返回结果也可以不止一个,用逗号分隔)

下面我们用一个例子来解释函数的细节

def double(x):
    print("我在一个名叫 “double” 函数里!")
    return 2 * x
  • 我们使用函数名来调用函数
  • 函数名后紧跟一对括号
  • 括号中是我们设定的参数的,一个不多,一个不少(这很重要)
  • 函数会返回设定的 return 语句的值(调用示例函数 double() 会返回一个值(2 * x))
print(double(2)) 
#输出:我在一个名叫 “double” 函数里!
#      4

print(double(1) + 3) 
#输出:我在一个名叫 “double” 函数里!
#      5

函数可以有任意多个参数,也可以一个都没有

# 三个参数
def f(x, y, z):
    return x + y + z

print(f(1, 3, 2)) # 返回 6

# 无参数
def g():
    return 42

print(g()) # 返回 42

可是如果参数数目没有匹配的话就会报错

多返回值

def Multi_Return_Values():
    return 9, 2, 8
a, b, c = Multi_Return_Values()
print(f"a={a}, b={b}, c={c}")
#a=9, b=2, c=8

语句与表达式 Statements and Expressions

An expression is a data value or an operation that evaluates to a value.

对于表达式

  • 它本身是
  • 它的计算结果是值

Statements, by contrast, do not evaluate to a value, and we can't print them. Usually they perform some action, though.

对于语句

  • 它不是值
  • 它不能打印
  • 但它能执行一些操作

表达式的一些例子

内置函数 Builtin Functions

就是 Python 自己带的函数啦

类型转换

print(bool(0))   # 转换为布尔类型(True or False),False

print(float(42)) # 转换为浮点数 , 42.0

print(int(2.8))  # 转换为一个整数(舍弃小数点),2

一些基本数学函数

但是它们不在 math 库中

print(abs(-5))   # 绝对值, 5
5
print(max(2,3))  # 返回最大值, 3
3
print(min(2,3))  # 返回最小值, 2
2
print(pow(2,10))  # 次方运算,等价于 2**10, 1024
1024
print(round(2.354, 2)) # 按照指定的位数对数值进行四舍五入(并不完全是四舍五入,二进制精度丢失)
2.35

变量作用域 Variable Scope

  • 每个变量都有属于自己的作用范围
  • 超出作用范围后,变量不可见

我们设定一个函数 f(x), 它的内部有 x 和 y 两个变量

记得一定要重启 Jupyter Kernel!

def f(x):
    print("x:", x)
    y = 5
    print("y:", y)
    return x + y
print(f(4))
#输出:x: 4
#      y: 5
#      9

print(x) # crash!

 函数内的变量具有局部作用域,它只存在于函数内部,与其他函数中的同名变量无关

复杂代码可使用改网站看过程:

def f(x):
    print("In f, x =", x)
    x += 5
    return x

def g(x):
    y = f(x*2)
    print("In g, x =", x)
    z = f(x*3)
    print("In g, x =", x)
    return y + z

print(g(2))
#输出:In f, x = 4
#      In g, x = 2
#      In f, x = 6
#      In g, x = 2
#      20
def f(x):
    print("In f, x =", x)
    x += 7
    return round(x / 3)

def g(x):
    x *= 10
    return 2 * f(x)

def h(x):
    x += 3
    return f(x+4) + g(x)

print(h(f(1)))

#输出:In f, x = 1
#     In f, x = 10
#     In f, x = 60
#     50

在函数外部定义变量时,变量具有全局作用域,在任何地方都可以使用

我们应该尽量避免使用全局变量,但是在非常少的一些场合你会需要用到它

g = 100

def f(x):
    return x + g

print(f(5)) # 105
print(f(6)) # 106
print(g)    # 100
g = 100

def f(x):
    # 如果我们想要修改 g 的值,我们必须声明它是全局变量
    # 否则 Python 会假设它是局部变量
    global g
    g += 1
    return x + g

print(f(5)) # 106
print(f(6)) # 108
print(g)    # 102

返回语句 Return Statements

def isPositive(x):
    return (x > 0)

print(isPositive(5))  # True

print(isPositive(-5)) # False

print(isPositive(0))  # False

一旦返回,函数立即结束!

def isPositive(x):
    print("Hello!")   # 会运行
    return (x > 0)
    print("Goodbye!") # 不会运行

print(isPositive(5))  # 输出 “Hello!” 然后返回 True

没有返回语句的时候,函数会返回 None

def f(x):
    x + 42

print(f(5)) # None

def f(x):
    result = x + 42

print(f(5)) # None

print() 和 return 是初学者比较容易出现的错误

def cubed(x):
    print(x**3)  # 这里的操作不太合适

cubed(2)  # 但是似乎看起来也正常运行了
#输出:8

print(cubed(3))  # 应该也能有效(但是返回 None,太怪了)
#输出:27
#      None

print(2*cubed(4)) # Error!
正确写法:

def cubed(x):
    return (x**3) # 这样做更好

cubed(2)  #似乎输出被忽略了,为什么?

print(cubed(3))  # 有效了!
#输出:27

print(2*cubed(4))  # 也是有效的!
#输出:128

函数组合 Function Composition

对于嵌套的函数而言,应该最先运行最内层的函数

def f(w):
    return 10*w

def g(x, y):
    return f(3*x) + y  #在我们返回它之前,我们必须先执行 f(3*x)

def h(z):
    return f(g(z, f(z+1)))  # 最内部的 f(z+1) 必须先执行

print(h(1)) # 你一定得“亲眼看看”

Helper Functions

编写函数是用来解决问题的

我们还可以编写函数来存储那些经常被用到的一系列操作

这种函数就叫做 Helper Function

#求个位数最大值
def onesDigit(n):
    return n%10

def largerOnesDigit(x, y):
    return max(onesDigit(x), onesDigit(y))

print(largerOnesDigit(134, 672)) # 4
print(largerOnesDigit(132, 674)) # 依然是 4

Don’t be the person who “never quite understood” something like recursion.

                                                                                —— Teach Yourself Computer Science

补充资料:

  • 递归&分治
  • Teach Yourself Computer Science

总结

  • 变量只是个标签,物理设备上有啥才是重点
  • 函数定义:def、header、body、缩进、return
  • 函数是有作用域的,类似双层玻璃,里面可以看见外面,外面不能看见里面
  • Helper Function 有时候会很有用
  • 一定要亲眼看你的代码是怎么跑起来的

你可能感兴趣的:(python,开发语言,ai)