Pennod 01: Newidynnau, Datganiadau Amodol a Lwpiau

Bydd y daflen lab cyntaf yma yn eich cyflwyno i raglenni. Mae disgwyl i chi gweithio trwy'r holl diwtorial a hefyd yr enghraifft weithredol. Mae ymarferion eraill sy'n anelu at wthio'ch dealltwriaeth ymhellach. Yn olaf ar ddiwedd y daflen mae linciau i adnoddau a thiwtorialau eraill efallai bydd yn help neu o ddiddordeb.

Mae fideos trwy gydol y taflenni yn disgrifio'r cysyniadau yn ogystal â dangos demos.

Dyma drosolwg o'r cwrs.

Gosod a rhedeg Python

Mae Python yn iaith rhaglenni. Mae yna nifer o ieithoedd rhaglenni gwahanol:

  • Java
  • C
  • C++
  • Ruby
  • VBA
  • a llawer mwy.

Mae iaith rhaglenni yn galluogi ni i ysgrifennu rhaglen sy'n ddilyniant o gyfarwyddiadau sy'n nodi sut mae perfformio cyfrifiad.

Wrth ysgrifennu rhaglen mae angen dau beth:

  • Rhywbeth i arbed y cod (golygydd testun er enghraifft)
  • Rhywbeth i redeg y cod

Byddwn ni'n defnyddio cyfuniad o'r ddau beth yma o'r enw notebook.

Gosod Python

Mae nifer o ddosbarthiadau o Python, byddwn ni'n defnyddio Anaconda sy'n dod wedi'i becynnu gydag amryw o offerynnau defnyddiol (gan gynnwys y notebooks soniais amdanynt uchod).

I'w osod ar eich peiriant personol dilynwch y camau yma:

  1. Ewch i'r wefan: www.continuum.io/downloads.
  2. Adnabyddwch a lawrlwythwch y fersiwn o Python 3 ar gyfer eich system weithredu (Windows, Mac OSX, Linux).
  3. Rhedwch yr osodwr.

Byddwn yn defnyddio notebooks Jupyter sy'n rhedeg tu fewn i'r porthwr we. I agor gweinydd lleol ffeindiwch y porthwr Continuum a chliciwch ar Jupyter. Does dim angen cael cysylltiad i'r we er mwyn defnyddio hwn.

Mae'r fideo yma yn dangos demo o ddefnyddio notebook.

Bydd y taflenni lab yma yn cynnwys pytiau cod. Maent yn dangos y cod dylech chi ysgrifennu ond hefyd yr allbwn disgwyliedig. Rhowch gynnig ar y canlynol:


In [1]:
print("Helo byd")


Helo byd

Tiwtorial

Gweithiwch trwy'r canlynol:


1: Creu newidynnau rhifiadol.

Fideo yn disgrifio'r cysyniad.

Fideo demo.

Un o'r blociau adeiladu unrhyw iaith rhaglenni yw newidynnau. Dyma sut rydym yn storio newidyn penodol gallwn ei ail-ddefnyddio:


In [2]:
oedran = 20
oedran


Out[2]:
20

Mae'n bosib cario allan nifer o weithrediadau rhifiadol ac u ail-aseinio gwerth y newidyn:


In [3]:
oedran = oedran + 1  # Ychwanegu 1 i'r oedran
oedran


Out[3]:
21

Mae gan Python llaw fer ar gyfer y cod uchod:


In [4]:
oedran += 1  # Ychwanegu 1 i'r oedran
oedran


Out[4]:
22

Gallwn wneud mwy na adio yn unig (arbrofwch gyda rhain oherwydd efallai bydd eu hangen nes ymlaen):

  • Tynnu: -
  • Lluosi: *
  • Rhannu: /
  • Esbonyddu: **
  • Rhannu modwlo: %

Gallwn wirio math ein newidynnau, mae hwn yn ddefnyddiol iawn wrth geisio deall gwallau ac/neu ymddygiad annisgwyl:


In [5]:
type(5)  # Cyfanrif


Out[5]:
int

In [6]:
type(5.4)  # 'float'


Out[6]:
float

Arbrofwch gyda thrin newidynnau rhifiadol.


2: Creu newidynnau o gymeriadau.

Fideo yn disgrifio'r cysyniad.

Fideo demo.

Math arall o newidyn a defnyddiwn yw newidyn o gymeriadau. Mewn rhaglenni fe elwir y rhain yn 'strings'.


In [7]:
enwcyntaf = "Vince"
enwcyntaf


Out[7]:
'Vince'

In [8]:
type(enwcyntaf)


Out[8]:
str

Gallwn hefyd creu strings newydd o rhai eraill:


In [9]:
enwolaf = "Knight"
enwllawn = enwcyntaf + " " + enwolaf
enwllawn


Out[9]:
'Vince Knight'

Arbrofwch trwy greu newidynnau string eich hun.


3. Newidynnau Boolean a datganiadau 'if'.

Fideo yn disgrifio'r cysyniad.

Fideo demo.

Gallwn ddefnyddio ieithoedd rhaglenni i wirio os yw datganiad yn wir neu beidio. Fe elwir newidyn sy'n gallu bod yn True neu yn False yn newidyn boolean. Dyma enghraifft:


In [10]:
a = 4
b = 8 / 2
a == b # Gwirio os yw a yn hafal i b


Out[10]:
True

In [11]:
a != b # Gwirio os NAD yw a yn hafal i b


Out[11]:
False

In [12]:
a >= b # Gwirio os yw a yn fwy na neu'n hafal i b


Out[12]:
True

In [13]:
a < b + 1  # Gwirio os yw a yn llai na b + 1


Out[13]:
True

Nodwch gallwch osod y datganiad ei hun i fod yn newidyn:


In [14]:
datganiad = a == b
datganiad


Out[14]:
True

In [15]:
type(datganiad)


Out[15]:
bool

Gallwn ddefnyddio hwn i gwblhau gweithrediadau gwahanol yn dibynnu os yw boolean yn wir neu beidio.


In [16]:
n = 11
if n <= 5:  # Arbrofwch trwy newid gwerth n
    gwerth = 1
elif n % 2 == 0:  # fel arall, os
    gwerth = 2
else:  # fel arall
    gwerth = 3
gwerth


Out[16]:
3

Mae mewnoliadau yn bwysig: bydd popeth sydd wedi'u mewnoli ar ôl y datganiadau if, elif, else yn rhedeg ar gyfer yr achos penodol yna.

Mae'r cod uchod yn cynhyrchu:

$$f(n)=\begin{cases} 1&\text{ os yw } n\leq 5\\ 2&\text{ os yw } n> 5\text{ ac } n \text{ yn eilrif }\\ 3&\text{ fel arall }\\ \end{cases}$$

Arbrofwch trwy newid y ffwythiant $f$ a newid y cod.


4. Lwpiau 'while'.

Fideo yn disgrifio'r cysyniad.

Fideo demo.

Mae'n bosib defnyddio cod i ailadrodd gweithrediadau. Dyma lwp while sy'n ailadrodd beth bynnag sydd wedi'i mewnoli oddi tanodd nes nad yw'r amod boolean yn wir ragor:


In [17]:
cyfrif = 0  # Newidyn i gyfri
cyfanswm = 0  # Byddwn yn symio'r deg rhif cyntaf
while cyfrif < 10:  # Cadw ailadrodd nes i'r cyfrif nes i'r cyfrif >= 10
    cyfrif += 1  # Adio 1 i'r cyfrif
    cyfanswm += cyfrif  # Adio'r cyfrif i'r cyfanswm
cyfanswm


Out[17]:
55

Arbrofwch trwy symio (neu efallai lluosi?) dros wahanol restrau o eitemau.


Enghraifft weithredol

Fideo yn disgrifio'r cysyniad.

Fideo demo.

Dyma enghraifft fach fwy cymhleth sy'n cyfuno'r cysyniadau amryw uchod.

Gadewch i ni wirio (nid prawf yw hwn!) bod y datganiad canlynol yn wir:

$$ \sum_{i=0}^n i ^ 2 = \frac{n(n+1)(2n+1)}{6} $$

Byddwn yn gwneud hwn trwy gyfrifo'r ochr chwith a'r ochr de:


In [18]:
n = 20
rhs = n * (n +  1) * (2 * n + 1) / 6
lhs = 0
i = 0
while i < n:
    i += 1
    lhs += i ** 2
lhs == rhs


Out[18]:
True

Gallwn roi'r holl beth mewn i lwp while er mwyn ei wirio ar gyfer nifer mawr o werthoedd o n:


In [19]:
n_macs = 2000
n = 0
while n < n_macs:
    n += 1
    rhs = n * (n +  1) * (2 * n + 1) / 6
    lhs = 0
    i = 0
    while i < n:
        i += 1
        lhs += i ** 2
    if lhs != rhs:      
        print(False)

Ymarferion

Dyma nifer o ymarferion sy'n bosib cyflawni gan ddefnyddio'r cysyniadau cod a thrafodir:

  • Aseinio newidynnau: er enghraifft a = 5
  • Triniaeth rhifyddeg: er enghraifft a += 1
  • Datganiadau amodol: er enghraifft if a == 7:
  • Lwpiau 'while': er enghraifft while a <= 10:

Ymarfer 1

Ymarfer datbygio

Fideo demo.

Isod yw cod sy'n ceisio gwirio'r unfathiant canlynol ar gyfer holl gwerthoedd llai na 200.

$$ \sum_{i=0}^ni ^ 3 = \frac{\left(n ^ 2 + n\right)^{2}}{4} $$

Mae o leiaf un gwall (hefyd elwir yn byg) yn y cod. Canfyddwch a chywirwch yr holl bygs.

n_macs = 2000
n = 0
while n > n_macs:
   n += 2
   rhs = ((n ** 2 + 2 * n) ** 2) / 4
   lhs = 0
   i = 0
   while i < n:
       i += 1
       lhs += i ** 2
   if lhs != rhs:
       print(False)

In [20]:
n_macs = 2000
n = 0
#while n > n_macs:  Mae'r anhafaledd yma yn wyneb i waered:
while n < n_macs:
    #n += 2  Fe dylwn cynyddu gan 1
    n += 1
    #rhs = ((n ** 2 + 2 * n) ** 2) / 4 Dyma'r fformiwla anghywir
    rhs = ((n ** 2 + n) ** 2) / 4
    lhs = 0
    i = 0
    while i < n:
        i += 1
        #lhs += i ** 2 Cynyddu gan y gwerth cywir
        lhs += i ** 3
    if lhs != rhs:
        print(False)

Ymarfer 2

Defnyddiwch god i wirio'r unfathiant canlynol:

$$ \sum_{i=0}^{n}i=\frac{n(n+1)}{2} $$

ar gyfer $n=20$.


In [21]:
# Dyma'r ochr dde:

n = 20
rhs = n * (n +  1) / 2
rhs


Out[21]:
210.0

In [22]:
# Dyma'r ochr chwith:

lhs = 0
i = 0
while i < n:
    i += 1
    lhs += i  # Dyma'r unig linell sy'n wahanol
lhs


Out[22]:
210

In [23]:
lhs == rhs


Out[23]:
True

Ymarfer 3

Newidiwch yr uchod (Ymarfer 2) i wirio os yw'n wir ar gyfer pob gwerth llai na 2000.


In [24]:
n_macs = 2000
n = 0
while n < n_macs:  # gwirio'r hafaliad ar gyfer n hyd at 2000
    n += 1
    rhs = n * (n +  1) / 2
    lhs = 0
    i = 0
    while i < n:
        i += 1
        lhs += i
    if lhs != rhs:
        print(False)  # Byddwn yn printio False os yw'r cod yn ffeindio gwall

Ymarfer 4

Cyfrifwch swm y rhifau naturiol llai na 1000 nad yw'n rhanadwy gan 3.


In [25]:
terfan_uchaf = 1000

cyfanswm = 0
rhif = 0

while rhif < terfan_uchaf:
    rhif += 1  # Cynyddu'r rhif
    if rhif % 3 != 0:  # Gwirio os yw'n rhanadwy gan 3
        cyfanswm += rhif
cyfanswm


Out[25]:
333667

Ymarfer 5

Cyfrifwch swm y 1000 rhif naturiol cyntaf nad yw'n rhanadwy gan 3.


In [26]:
terfan_uchad = 1000

cyfanswm = 0
rhif = 0
cyfrif = 0

while cyfrif < terfan_uchaf:
    rhif += 1  # Cynyddu'r rhif
    if rhif % 3 != 0:  # Gwirio os yw'n rhanadwy gyda 3
        cyfanswm += rhif
        # Cadw tra ar faint o rhifau sydd gennym sy'n nad rhanadwy gyda 3.
        cyfrif += 1  
cyfanswm


Out[26]:
750000

Ymarfer 6

Fe ellir dangos (does dim angen profi hwn) bod y dilyniant canlynol:

$$ x_{n+1}=\frac{x_n + K / x_{n}}{2} $$

yn agosáu ar $\sqrt{K}$ wrth i $n$ cynyddu. Ysgrifennwch god i wirio hwn ar gyfer unrhyw lefel o drachywiredd.


In [27]:
epsilon = 0.001
K = 92  # Mae hwn yn gosod y gwerth cyntaf i cymryf ail isradd ohono
X = K / 4.0  # Mae hwn yn dewis gwerth cychwynnol y dilyniant
while abs(X**2 - K) > epsilon:  # abs yw'r gwerth absoliwt
    X = (X + K / X) / 2
    print(X)


13.5
10.157407407407408
9.607418380093858
9.591675965316126

In [28]:
# gwiriwn
round(X ** 2, 3)


Out[28]:
92.0

In [ ]: