计算机科学和Python编程导论week2
授课用的python版本是2.x,如果自己用的是py3.x,昨天或者测试的时候会略有不同。
参考:
Py3.x和Py2.x区别
Python2.x与3.x版本区别
关于变量,全局变量和局部变量
局部变量是作用在局部的,比如说函数内部,而不受外部的影响。但是全部变量也会影响到函数内部。
# 比如下面函数f()中的y就是局部变量。
In [59]: def f(x):
...: y = 1
...: x = x + y
...: print('x = ' + str(x))
...: return x
...: x = 3
...: y = 2
...:
In [60]: z = f(x)
x = 4
In [61]: x
Out[61]: 3
In [62]: y
Out[62]: 2
# 在变量前加global进行全局变量声明,来表名这个变量是属于全部变量。
# 从而来定义全局变量在代码所在函数外层的模块作用域中的,而不是在代码所在函数的作用域中的。
函数和变量传递
In [1]: def square_sum(a,b):
...: c = a**2 + b**2
...: return c
...:
In [2]: square_sum(3,4)
Out[2]: 25
# 例子一
In [3]: a = 1
In [4]: def change_integer(a):
...: a = a + 1
...: return a
...:
In [5]: print(change_integer(a))
2
In [6]: print(a)
1
# 例子二:
In [7]: b = [1,2,3]
In [9]: def change_list(b):
...: b[0] = b[0] + 1
...: return b
...: print (change_list(b))
...: print (b)
...:
[2, 2, 3]
[2, 2, 3]
第一个例子,我们将一个整数变量传递给函数,函数对它进行操作,但原整数变量a不发生变化。
第二个例子,我们将一个表传递给函数,函数进行操作,原来的表b发生变化。
对于基本数据类型的变量,变量传递给函数后,函数会在内存中复制一个新的变量,从而不影响原来的变量。(我们称此为值传递)
但是对于表来说,表传递给函数的是一个指针,指针指向序列在内存中的位置,在函数中对表的操作将在原有内存中进行,从而影响原有变量。 (我们称此为指针传递)
函数中的各种参数比较
在Python函数中,当程序执行到return的时候,程序将停止执行函数内余下的语句。return并不是必须的,当没有return, 或者return后面没有返回值时,函数将自动返回None。None是Python中的一个特别的数据类型,用来表示什么都没有,相当于C中的NULL。None多用于关键字参数传递的默认值。
参数可以有多个,也可以完全没有(但括号要保留)
下是调用函数时可使用的正式参数类型:
位置参数
关键字参数
默认参数
不定长参数
1、位置参数
# power(x, n)函数有两个参数:x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n。
In [29]: def power(x,n):
...: s = 1
...: while n > 0:
...: n = n - 1
...: s = s * x
...: return s
In [30]: power(5,2)
Out[30]: 25
In [31]: power(5,3)
Out[31]: 125
2、默认参数
# 在定义的有两个位置参数的函数power()中,只输入一个参数的时候会报错
In [32]: power(5)
Traceback (most recent call last):
File "<ipython-input-32-1fcd865a69f9>", line 1, in <module>
power(5)
TypeError: power() missing 1 required positional argument: 'n'
# 将第二个参数设置为默认参数进行调用如下:
In [33]: def power(x,n=2):
...: s = 1
...: while n > 0:
...: n = n - 1
...: s = s * x
...: return s
...:
In [34]: power(5)
Out[34]: 25
In [35]: power(8)
Out[35]: 64
In [36]: power(5,3)
Out[36]: 125
3、可变参数
# 定义可变参数,仅仅在参数前面加了一个*号。
In [37]: def calc(*numbers):
...: sum = 0
...: for n in numbers:
...: sum = sum + n * n
...: return sum
...:
In [38]: calc(1,2)
Out[38]: 5
In [39]: calc()
Out[39]: 0
4、关键字参数
# 关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
In [40]: def person(name, age, **kw):
...: print('name:',name,'age:',age,'other:',kw)
...:
In [41]: person('Michael',30)
name: Michael age: 30 other: {}
In [42]: person('Adam',45,gender='M',job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
要注意定义可变参数和关键字参数的语法:
*args是可变参数,args接收的是一个tuple
**kw是关键字参数,kw接收的是一个dict
Python的斐波那契数列
递归。所谓递归就是在函数内部调用函数本身。
In [29]: listt = []
...: def fib(n):
...: if n == 0 or n == 1:
...: return n
...: else:
...: return fib(n-1) + fib(n-2)
In [53]: def testFib(n):
...: for i in range(n+1):
...: print('fib of ', i, '= ', fib(i))
# 比如测试下前九项斐波那契数列。但数字越大的时候后面运算的开销越大。
In [58]: testFib(8)
fib of 0 = 0
fib of 1 = 1
fib of 2 = 1
fib of 3 = 2
fib of 4 = 3
fib of 5 = 5
fib of 6 = 8
fib of 7 = 13
fib of 8 = 21
# 也可以将斐波那契数列存到一个列表里
In [57]: listt = []
...: for i in range(8):
...: listt.append(fib(i))
...: print(listt)
...:
[0, 1, 1, 2, 3, 5, 8, 13]
文件处理。
打开一个文件:
f = open(文件名,模式)
最常用的模式有:
"r" # 只读
“w” # 写入
比如
f = open("test.txt","r")
读取:
content = f.read(N) # 读取N bytes的数据
content = f.readline() # 读取一行
content = f.readlines() # 读取所有行,储存在列表中,每个元素是一行。
写入:
f.write('I like apple') # 将'I like apple'写入文件
关闭文件:
f.close()
对于视频中错题目总结
# 做一个练习题的时候py3.x中第二个出现错误,没搞懂啥原因。因为是版本造成的。
In [47]: def a(x, y, z):
...: if x:
...: return y
...: else:
...: return z
...:
...: def b(q, r):
...: return a(q>r, q, r)
...:
In [48]: a(3>2, a, b)
Out[48]: <function __main__.a>
In [49]: b(a, b)
Traceback (most recent call last):
File "<ipython-input-49-7cd669f32247>", line 1, in <module>
b(a, b)
File "<ipython-input-47-019acf545903>", line 8, in b
return a(q>r, q, r)
TypeError: '>' not supported between instances of 'function' and 'function'
对于视频中的一段代码的练习,注意for循环下if和else的缩进不同的效果
In [3]: x = int(input('Enter an integer:'))
...: for ans in range(0, abs(x)+1):
...: if ans**3 == abs(x):
...: break
...: if ans**3 != abs(x):
...: print(str(x)+'is not a perfect cube')
...: else:
...: if x < 0:
...: ans = -ans
...: print('Cube root of '+str(x)+' is '+str(ans))
...:
Enter an integer:-27
Cube root of -27 is -3
In [4]: x = int(input('Enter an integer:'))
...: for ans in range(0, abs(x)+1):
...: if ans**3 == abs(x):
...: break
...: if ans**3 != abs(x):
...: print(str(x)+'is not a perfect cube')
...: else:
...: if x < 0:
...: ans = -ans
...: print('Cube root of '+str(x)+' is '+str(ans))
...:
Enter an integer:27
27is not a perfect cube
27is not a perfect cube
27is not a perfect cube
关于视频中的二分查找,来求平方根
In [46]: x= 26
...: epsilon = 0.01
...: numGuesses = 0
...: low = 0.0
...: high = x
...: ans = (high + low)/2.0
...: while abs(ans**2 - x) >= epsilon:
...: print('low = ' + str(low) + ' high = ' + str(high) + ' ans = ' + str(ans))
...: numGuesses += 1
...: if ans**2 < x:
...: low = ans
...: else:
...: high = ans
...: ans = (high + low)/2.0
...: print('numGuesses = ' + str(numGuesses))
...: print(str(ans) + ' is close to square root of ' + str(x))
...:
low = 0.0 high = 26 ans = 13.0
low = 0.0 high = 13.0 ans = 6.5
low = 0.0 high = 6.5 ans = 3.25
low = 3.25 high = 6.5 ans = 4.875
low = 4.875 high = 6.5 ans = 5.6875
low = 4.875 high = 5.6875 ans = 5.28125
low = 4.875 high = 5.28125 ans = 5.078125
low = 5.078125 high = 5.28125 ans = 5.1796875
low = 5.078125 high = 5.1796875 ans = 5.12890625
low = 5.078125 high = 5.12890625 ans = 5.103515625
low = 5.078125 high = 5.103515625 ans = 5.0908203125
low = 5.0908203125 high = 5.103515625 ans = 5.09716796875
low = 5.09716796875 high = 5.103515625 ans = 5.100341796875
numGuesses = 13
5.0987548828125 is close to square root of 26
关于课程结束后的作业
set1:
Write a program that counts up the number of vowels contained in the string s.
Valid vowels are: 'a', 'e', 'i', 'o', and 'u'. For example, if s = 'azcbobobegghakl', your program should print:
Number of vowels: 5
ll =['a', 'e', 'i', 'o','u']
count = 0
for i in s:
if i in ll:
count = count + 1
print (count)
set1:
Write a program that prints the number of times the string 'bob' occurs in s.
For example, if s = 'azcbobobegghakl', then your program should print
Number of times bob occurs is: 2
# Paste your code into this box
count = 0
for i in range(len(s)-1):
if s[i:i+3] == 'bob':
count = count + 1
print(count)
参考链接:
函数的参数
python 函数
菜鸟教程 Python函数
Improve Your Python Skills